2011-08-24 8 views
5

Sto cercando di esporre un file .png che si trova nella directory dell'applicazione/dati attraverso un ContentProvider ma invece di raggiungere il metodo openFile viene chiamato . Ora ho sempre e solo una singola immagine che ho bisogno di esporre per la condivisione ad altre applicazioni, come posso impostare la mia intenzione di andare a openFile invece di query?Condivisione di un'immagine nella directory dati dell'app tramite un ContentProvider su Android

Intent shareImageIntent = new Intent(Intent.ACTION_SEND); 

      shareImageIntent.setType("image/*"); 

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

Qualora l'Uri sembra

content://my.package.contentprovider/fileName 

Oppure, in alternativa ho bisogno per creare un database per questo e restituire un cursore?

UPDATE

Quindi questo sembra essere al lavoro su tutto, tranne l'applicazione SMS (che è quello che ho deciso di provare prima) Vorrei supportare la condivisione ad esso comunque.

Ecco la relativa analisi dello stack:

Causato da: java.lang.IllegalArgumentException: Query contenuti: //mypackage.myprovider/someImage.png ritorna risultato nullo. a com.android.mms.ui.UriImage.initFromContentUri (UriImage.java:104) a com.android.mms.ui.UriImage. (UriImage.java:63) a com.android.mms.model.ImageModel .initModelFromUri (ImageModel.java:83) a com.android.mms.model.ImageModel. (ImageModel.java:65) a com.android.mms.data.WorkingMessage.changeMedia (WorkingMessage.java:481) in com.android.mms.data.WorkingMessage.setAttachment (WorkingMessage.java:375) ...

Quindi l'applicazione SMS sta eseguendo una query invece di leggere direttamente dal openFile, che ogni altra applicazione sul mio il telefono sembra fare (incluso ot le sue app Google)

Qualcuno sa cosa ho bisogno di tornare qui per completare la query in modo appropriato? Ora sto scavando AOSP.

risposta

4

Dopo aver scavato attraverso il codice sorgente dell'applicazione SMS (MMS), questo è ciò che mi è venuto in mente.

All'interno UriImage.initFromContentUri l'applicazione rende il codice query e si presuppone ci sono 2 restituiti colonne nella Cursor

} else { 
    filePath = c.getString(c.getColumnIndexOrThrow(Images.Media.DATA)); 
    mContentType = c.getString(c.getColumnIndexOrThrow(Images.Media.MIME_TYPE)); 
} 

Così inorder per il vostro ContentProvider a lavorare con l'applicazione MMS, è necessario restituire un Cursor in query che ha solo una riga e le due colonne (Images.Media.DATA & Images.Media.MIME_TYPE) con i dati appropriati. L'MMS effettuerà quindi la chiamata a openFile per recuperare effettivamente l'immagine.

+0

Thx per questa grande risposta! – Snicolas

+0

Si noti inoltre che le colonne non sono richieste ma devono essere riempite per l'app sms. – Snicolas

2

Un modo più semplice per condividere una risorsa immagine è per salvarla nella memoria esterna (scheda SD) e poi fare:

Uri imageUri = Uri.fromFile(pathToFile); 

Aggiornamento:

Provare a utilizzare

Uri imageUri = Uri.parse("android.resource://com.package.yourapp/" +imageResID); 

Aggiornamento2

Prova file da Media Store salvataggio e poi inviarlo:

String url = Media.insertImage(context.getContentResolver(), imageFile.getAbsolutePath(), imageFile.getName(), imageFile.getName()); 

Uri imageUri = Uri.parse(url); 

aggiornamento finale utilizzando ContentProvider e Cursor:

tuo ContentProvider devono attuare query(..) metodo e deve restituire un Cursor.Vedi lo source code of UrlImage.initFromContentUri(..) (che viene utilizzato internamente dall'app MMS) per vedere come viene chiamato il cursore. Dai uno sguardo allo MatrixCursor se si adatta al conto.

+0

Im in particolare cercando di accedere alla mia memoria interna. Sto usando l'esterno di default ma se non è disponibile ho bisogno di un fallback. – smith324

+0

Dai un'occhiata a questo: http://stackoverflow.com/questions/7175498/why-doesnt-this-code-attach-an-image-to-mms-message –

+0

Cosa succede se l'utente non ha una scheda SD? Strano ma possibile. –

0

Se il fornitore di contenuti è già funzionante, è possibile accedere a un dispositivo ParcelFileDescriptor tramite il metodo openFileDescriptor nel provider di contenuti.

Un rapido, e sporco, esempio di questo:

ParcelFileDescriptor descriptor = mContext.getContentResolver().openFileDescriptor(IMGURI, "r"); 
Bitmap bmp = BitmapFactory.decodeFileDescriptor(descriptor.getFileDescriptor()); 

Cheers!

+0

Sì, il mio ContentResolver funziona correttamente, il problema è che l'app SMS non la sta usando correttamente. Si prega di consultare il mio aggiornamento. – smith324

Problemi correlati