2015-11-07 54 views
0

我想在我的應用程序在Instagram上分享圖像。我有圖像的網址,並使用畢加索圖書館下載圖像。Android:加載圖像與畢加索onBitMapLoaded不叫

Target target = new Target() { 
      @Override 
      public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) { 
       Log.d(TAG, "Bitmap Loaded"); 
       File outputDir = getApplicationContext().getCacheDir(); // context being the Activity pointer 
       try { 
        File outputFile = File.createTempFile("instagram", "png", outputDir); 
        outputFile.createNewFile(); 
        FileOutputStream ostream = new FileOutputStream(outputFile); 
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,ostream); 
        ostream.close(); 
        Log.d(TAG, "Image downloaded"); 
        shareOnInstagram(Uri.fromFile(outputFile)); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }; 
     Picasso.with(this).load(imageUrl).into(target); 

但onBitmapLoaded永遠不會被調用。有沒有其他方式可以通過網址分享Instagram上的圖片?在Instagram上分享的意圖需要Intent.EXTRA_STREAM參數,其參數應該是media path on device。 如何將圖片從網址轉換爲該類型?

+0

http://stackoverflow.com/a/43134498/5488468試試這可能是工作 –

回答

2

畢加索只對目標保持弱引用,所以在你的情況下它將被垃圾收集。因此,onBitmapLoaded不被調用。

您應該存儲對目標的強引用(使您的類的目標成員)。

+0

謝謝。有效。 – crysis

1

我使用這種方法

public class ShareToOtherApp extends AsyncTask<Bitmap, Void, Uri> { 


    @Override 
    protected Uri doInBackground(Bitmap... bitmaps) { 

     return bitmaps.length > 0 ? BitmaptoUri(bitmaps[0]) : null; 
    } 

    @Override 
    protected void onPostExecute(Uri uri) { 


     Intent shareIntent = new Intent(); 
     shareIntent.setAction(Intent.ACTION_SEND); 

     if (uri != null) { 
      shareIntent.putExtra(Intent.EXTRA_STREAM, uri); 
     } 

     shareIntent.setType("image/*"); 
     Intent chooserIntent = Intent.createChooser(shareIntent, "Share Image"); 
     chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     MyApp.GetContext().startActivity(chooserIntent); 

    } 

    public File GetSDCardDir(){ 
     boolean ISSDCard; 
     File[] Dirs = ContextCompat.getExternalFilesDirs(MyApp.GetContext(), null); 

     ISSDCard = false; 
     for (File Dir : Dirs) { 
      if (Dir != null) { 
       if (Dir.getPath().contains("sdcard")) { 
        ISSDCard = true; 
        break; 
       } 
      } 
     } 

     File SDCardDir; 
     if(ISSDCard && Dirs[Dirs.length -1] != null){ 
      SDCardDir = Dirs[Dirs.length -1]; 
     }else{ 
      SDCardDir = Dirs[0]; 
     } 

     return SDCardDir; 
    } 

    public Uri BitmaptoUri(Bitmap bitmap){ 
     Uri uri = null; 
     try { 
      File file = new File(GetSDCardDir() , HConstants.IMG_FILE_NAME + ".jpg"); 

      if(file.getParentFile() != null){ 
       file.getParentFile().mkdirs(); 
      }else{ 
       GetSDCardDir().mkdirs(); 
      } 
      file.createNewFile(); 

      FileOutputStream out = new FileOutputStream(file); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      out.close(); 

      uri = Uri.fromFile(file); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

     return uri; 
    } 
} 

終於從它使用。

new ShareToOtherApp().execute(bitmap);