2015-11-07 1 views
0

Я пытаюсь обмениваться имиджем на Instagram в своем приложении. У меня есть URL-адрес изображения и библиотека Picasso для загрузки изображения.Android: Загрузить изображение с Picasso 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 с URL-адресом? Предположение, которое делится на Instagram, принимает параметр Intent.EXTRA_STREAM, который должен быть media path on device. Как преобразовать изображение из URL-адреса в этот тип?

+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);