2015-11-07 53 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);