2013-04-30 14 views
10

voglio condividere un'immagine utilizzando questo codice:immagine Android quota dal url

Intent sharingIntent = new Intent(Intent.ACTION_SEND); 
Uri imageUri = Uri.parse("http://stacktoheap.com/images/stackoverflow.png"); 
sharingIntent.setType("image/png"); 
sharingIntent.putExtra(Intent.EXTRA_STREAM, imageUri); 
startActivity(sharingIntent); 

ho fatto un pulsante che chiamare il codice di cui sopra. L'intento di condivisione è stato aperto, ma ho ottenuto se clicco su "Condividi con MMS": "non posso aggiungere questa immagine al tuo messaggio", Se facebook ho solo un'area di testo senza la mia immagine.

2 giorni con il tentativo, ma senza risultato :(

si prega di aiuto

risposta

-1

Utilizzando createchooser è possibile raggiungere questo obiettivo,

Intent sharingIntent = new Intent(Intent.ACTION_SEND); 
Uri screenshotUri = Uri.parse(path); 

sharingIntent.setType("image/png"); 
sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri); 
startActivity(Intent.createChooser(sharingIntent, "Share image using")); 

registrazione al Intent

Se volete che il vostro l'app deve essere elencata quando viene chiamato questo intent, quindi devi aggiungere un filtro intent nel file manifest.xml

<intent-filter> 
<action android:name="android.intent.action.SEND" /> 
<category android:name="android.intent.category.DEFAULT" /> 
<data android:mimeType="image/*" /> 
</intent-filter> 
+0

esattamente dove devo mettere il .....

+0

di seguito nella tua attività principale – AndroidEnthusiastic

+0

l'attività principale ha azione e categoria, il mio problema non è quello, il mio problema è l'immagine non collegata all'attività di condivisione –

3

È necessario utilizzare un file locale. In questo modo:

 Uri imageUri = Uri.parse("android.resource://your.package/drawable/fileName"); 
     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setType("image/png"); 

     intent.putExtra(Intent.EXTRA_STREAM, imageUri); 
     startActivity(Intent.createChooser(intent , "Share")); 

Se l'immagine è sul server remoto, scaricala prima sul dispositivo.

+0

Come posso utilizzare un file scaricato per condividerlo? –

+0

@CoderPhp Ottieni il suo percorso Uri. [qui] (http://developer.android.com/training/basics/data-storage/files.html) è un tutorial su come farlo –

18

io uso questi codici da this tutorial

 final ImageView imgview= (ImageView)findViewById(R.id.feedImage1); 

       Uri bmpUri = getLocalBitmapUri(imgview); 
       if (bmpUri != null) { 
        // Construct a ShareIntent with link to image 
        Intent shareIntent = new Intent(); 
        shareIntent.setAction(Intent.ACTION_SEND); 
        shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri); 
        shareIntent.setType("image/*"); 
        // Launch sharing dialog for image 
        startActivity(Intent.createChooser(shareIntent, "Share Image"));  
       } else { 
        // ...sharing failed, handle error 
       } 

poi aggiungere questo alla vostra attività

public Uri getLocalBitmapUri(ImageView imageView) { 
    // Extract Bitmap from ImageView drawable 
    Drawable drawable = imageView.getDrawable(); 
    Bitmap bmp = null; 
    if (drawable instanceof BitmapDrawable){ 
     bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); 
    } else { 
     return null; 
    } 
    // Store image to default external storage directory 
    Uri bmpUri = null; 
    try { 
     File file = new File(Environment.getExternalStoragePublicDirectory( 
      Environment.DIRECTORY_DOWNLOADS), "share_image_" + System.currentTimeMillis() + ".png"); 
     file.getParentFile().mkdirs(); 
     FileOutputStream out = new FileOutputStream(file); 
     bmp.compress(Bitmap.CompressFormat.PNG, 90, out); 
     out.close(); 
     bmpUri = Uri.fromFile(file); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return bmpUri; 
} 

quindi aggiungere l'applicazione manifesta

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
+1

Se stai permettendo di scrivere, devi chiedere il permesso di lettura come bene? – Lion789

+0

@ Lion789 no, uno di loro è sufficiente. Infatti, se usi 'Context.getExternalFilesDir()' non hai bisogno di autorizzazione :) –

29

Una versione adattata di @ di eclass risposta che non richiede l'uso di ImageView:

Usa Picasso per caricare l'URL in una bitmap

public void shareItem(String url) { 
    Picasso.with(getApplicationContext()).load(url).into(new Target() { 
     @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
      Intent i = new Intent(Intent.ACTION_SEND); 
      i.setType("image/*"); 
      i.putExtra(Intent.EXTRA_STREAM, getLocalBitmapUri(bitmap)); 
      startActivity(Intent.createChooser(i, "Share Image")); 
     } 
     @Override public void onBitmapFailed(Drawable errorDrawable) { } 
     @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } 
    }); 
} 

Converti bitmap in Uri

public Uri getLocalBitmapUri(Bitmap bmp) { 
    Uri bmpUri = null; 
    try { 
     File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png"); 
     FileOutputStream out = new FileOutputStream(file); 
     bmp.compress(Bitmap.CompressFormat.PNG, 90, out); 
     out.close(); 
     bmpUri = Uri.fromFile(file); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return bmpUri; 
} 
+0

La migliore soluzione finora. Grazie! – ulughbekula

+0

getExternalFilesDir() non risolto. ? – deejay

+0

capito .. getExternalFilesDir è un metodo di contesto, quindi se vuoi usarlo in qualche classe dell'adattatore, prendi semplicemente il contesto dalla classe base nel costruttore e usalo come questo '_context.getExternalFilesDir()' .. grazie. – deejay

0

Dopo un sacco di riflettere, ecco il codice che ho trovato a lavorare per me! Penso che questa sia una delle versioni più semplici del codice per ottenere il compito dato usando Picasso. Non è necessario creare un oggetto ImageView.

  Target target = new Target() { 
      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       bmp = bitmap; 
       String path = MediaStore.Images.Media.insertImage(getContentResolver(), bmp, "SomeText", null); 
       Log.d("Path", path); 
       Intent intent = new Intent(Intent.ACTION_SEND); 
       intent.putExtra(Intent.EXTRA_TEXT, "Hey view/download this image"); 
       Uri screenshotUri = Uri.parse(path); 
       intent.putExtra(Intent.EXTRA_STREAM, screenshotUri); 
       intent.setType("image/*"); 
       startActivity(Intent.createChooser(intent, "Share image via...")); 
      } 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) { 

      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) { 

      } 
     }; 
     String url = "http://efdreams.com/data_images/dreams/face/face-03.jpg"; 
     Picasso.with(getApplicationContext()).load(url).into(target); 

Qui, BMP è una variabile Bitmap livello di classe e l'URL sarà l'url Internet dinamico alla vostra immagine per la condivisione. Inoltre, invece di mantenere il codice da condividere all'interno della funzione onBitmapLoaded(), può anche essere mantenuto all'interno di un'altra funzione di gestore e successivamente chiamato dalla funzione onBitmapLoaded(). Spero che questo ti aiuti!

1

Prova questo:

new OmegaIntentBuilder(context) 
       .share() 
       .filesUrls("http://stacktoheap.com/images/stackoverflow.png") 
       .download(new DownloadCallback() { 
        @Override 
        public void onDownloaded(boolean success, @NotNull ContextIntentHandler contextIntentHandler) { 
         contextIntentHandler.startActivity(); 
        } 
       }); 

https://github.com/Omega-R/OmegaIntentBuilder