2013-06-13 8 views
10

Sto sviluppando un'app per Android che è una galleria di immagini in cui le immagini vengono scaricate da Internet per la visualizzazione sullo schermo di smathphone. Le immagini vengono visualizzate una alla volta e l'applicazione ha un pulsante per condividere l'immagine che viene visualizzata.Condividere un'immagine con un fornitore di contenuti nell'app per Android

Seguendo le indicazioni che ho trovato in un post di StackOverflow che indicava che il modo giusto per condividere un'immagine stava usando un ContentProvider, ho implementato il seguente codice che funziona per condividere le immagini di alcune applicazioni (ad es. Twitter, Gmail. ..) ma non funziona per gli altri (Facebook, Yahoo, MMS ...).

Quindi mostro il codice utilizzato sperando che tu possa aiutarmi a ottenere l'implementazione corretta per condividere le immagini in tutte le applicazioni.

Inizialmente catturare il pulsante per condividere:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if (item.getItemId() == R.id.menu_share) { 

     // I get the image being displayed on the screen 
     View root = getView(); 
     ImageView imageView = (ImageView) root.findViewById(R.id.image); 
     Drawable imageToShareDrawable = imageView.getDrawable(); 

     if (imageToShareDrawable instanceof BitmapDrawable) { 

      // I convert the image to Bitmap 
      Bitmap imageToShare = ((BitmapDrawable) imageToShareDrawable).getBitmap(); 

      // Name of de image extracted from a bean property 
      String fileName = quote.getImage(); 

      // I keep the image in the folder "files" of internal storage application 
      TempInternalStorage.createCachedFile(fileName, imageToShare, getActivity().getApplicationContext()); 

      // I start the Activity to select the application to share the image after the intent Built with the method "getDefaultShareIntent" 
      startActivity(getDefaultShareIntent(fileName)); 
     } else { 
      Toast.makeText(getActivity().getApplicationContext(), "Please wait, the quote is being downloaded", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    return true; 
} 

Il metodo per salvare l'immagine nella memoria interna della domanda è il seguente:

public static void createCachedFile(String fileName, Bitmap image, Context context) { 

    try { 
     File file = new File(context.getFilesDir(), fileName); 

     if (!file.exists()) { 
      FileOutputStream fos = new FileOutputStream(file); 
      image.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
      fos.flush(); 
      fos.close(); 
     } 
    } catch (Exception e) { 
     Log.e("saveTempFile()", "**** Error"); 
    } 
} 

Il metodo che costruisce l'intento per condividerlo:

Infine il codice di ContentProvider è il seguente:

public class CachedFileProvider extends ContentProvider { 

private static final String CLASS_NAME = "CachedFileProvider"; 

public static final String AUTHORITY = "com.example.appname.cachefileprovider"; 

private UriMatcher uriMatcher; 

@Override 
public boolean onCreate() { 
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 

    uriMatcher.addURI(AUTHORITY, "img/*", 1); 

    return true; 
} 

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 

    String LOG_TAG = CLASS_NAME + " - openFile"; 

    Log.i(LOG_TAG, "Called with uri: '" + uri + "'." + uri.getLastPathSegment()); 

    switch (uriMatcher.match(uri)) { 

    case 1: 

     String fileLocation = getContext().getFilesDir() + File.separator + uri.getLastPathSegment(); 

     ParcelFileDescriptor image = ParcelFileDescriptor.open(new File(fileLocation), ParcelFileDescriptor.MODE_READ_ONLY); 

     return image; 

    default: 
     Log.i(LOG_TAG, "Unsupported uri: '" + uri + "'."); 
     throw new FileNotFoundException("Unsupported uri: " + uri.toString()); 
    } 
} 

@Override 
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) { 
    return 0; 
} 

@Override 
public int delete(Uri uri, String s, String[] as) { 
    return 0; 
} 

@Override 
public Uri insert(Uri uri, ContentValues contentvalues) { 
    return null; 
} 

@Override 
public String getType(Uri uri) { 
    return null; 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String s, String[] as1, String s1) { 

    MatrixCursor c = null; 

    Log.i(">>>> projection", java.util.Arrays.toString(projection)); 

    String fileLocation = getContext().getFilesDir() + File.separator + uri.getLastPathSegment(); 

    File file = new File(fileLocation); 

    long time = System.currentTimeMillis(); 

    c = new MatrixCursor(new String[] { "_id", "_data", "orientation", "mime_type", "datetaken", "_display_name" }); 

    c.addRow(new Object[] { 0, file, 0, "image/jpeg", time, uri.getLastPathSegment() }); 

    return c; 
} 

@Override 
public String[] getStreamTypes(Uri uri, String mimeTypeFilter) { 
    return null; 
} 

}

Ho scoperto che quando l'immagine è la condivisione di alcune applicazioni solo chiamare il metodo "query" (questi sono dove il codice non funziona e non posso condividere l'immagine) mentre ci sono altri che chiamano anche il metodo "query" chiamano anche il metodo "openFile" e questi funzionano e posso condividere l'immagine.

Spero che tu possa aiutarmi, grazie mille in anticipo.

+0

Hai trovato una soluzione? Tra l'altro questo link potrebbe essere interessante per te: https://github.com/xperimental/BinaryContent – rekire

+0

hai condiviso con successo la tua immagine puoi aiutarmi come posso condividere l'immagine dalla cartella drawable? – Erum

+1

@Mike puoi condividere per favore qual è stato l'errore nel tuo codice? – Erum

risposta

0

Come commentato da @Sun Ning-s alcune "app di destinazione condivisa" possono gestire gli URI che iniziano con "content: // .." che avete implementato.

Altre applicazioni di gestire file di uri-s inizia con "file: // ...." in modo da avere per implementare una seconda quota di menù "condivisione come file"

private Intent getFileShareIntent(String fullPathTofile) { 
    final Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.setType("image/jpeg"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + fullPathTofile)); 
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

    return shareIntent; 
} 

È possibile utilizzare il android app intentintercept per scopri quali sono le "altre app di condivisione" fornite.

Problemi correlati