Android Condivisione di un file


Esempio

In questo esempio imparerai come condividere un file con altre app. In questo esempio useremo un file pdf anche se il codice funziona anche con ogni altro formato.

La tabella di marcia:

Specificare le directory in cui sono posizionati i file che si desidera condividere

Per condividere file utilizzeremo un FileProvider, una classe che consente la condivisione sicura dei file tra le app. Un FileProvider può solo condividere file in directory predefinite, quindi definiamoli.

  1. Creare un nuovo file XML che conterrà i percorsi, ad esempio res / xml / filepaths.xml

  2. Aggiungi i percorsi

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <files-path name="pdf_folder" path="documents/"/>
    </paths>
    

Definire un FileProvider e collegarlo con i percorsi dei file

Questo è fatto nel manifest:
<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.context.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>
        ...
    </application>
    ...
</manifest>

Genera l'URI per il file

Per condividere il file dobbiamo fornire un identificatore per il file. Questo viene fatto usando un URI (Uniform Resource Identifier).
// We assume the file we want to load is in the documents/ subdirectory
// of the internal storage
File documentsPath = new File(Context.getFilesDir(), "documents");
File file = new File(documentsPath, "sample.pdf");
// This can also in one line of course:
// File file = new File(Context.getFilesDir(), "documents/sample.pdf");

Uri uri = FileProvider.getUriForFile(getContext(), "com.mydomain.fileprovider", file);

Come puoi vedere nel codice, prima creiamo una nuova classe File che rappresenta il file. Per ottenere un URI chiediamo a FileProvider di ottenerne uno. Il secondo argomento è importante: passa l'autorità di un FileProvider. Deve essere uguale all'autorità del FileProvider definita nel manifest.

Condividi il file con altre app

Usiamo ShareCompat per condividere il file con altre app:
Intent intent = ShareCompat.IntentBuilder.from(getContext())
    .setType("application/pdf")
    .setStream(uri)
    .setChooserTitle("Choose bar")
    .createChooserIntent()
    .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Context.startActivity(intent);

Un selettore è un menu da cui l'utente può scegliere con quale app desidera condividere il file. Il flag Intent.FLAG_GRANT_READ_URI_PERMISSION è necessario per concedere l'autorizzazione di accesso in lettura temporanea all'URI.