Android sharing Files, by sending them via email or other apps

JavaAndroidAndroid IntentSharing

Java Problem Overview


I have a list of files in my android app and I want to be able to get the selected items and send them via email or any other sharing app. Here is my code.

Intent sendIntent = new Intent();
                    sendIntent.setAction(Intent.ACTION_SEND);
                    sendIntent.putExtra(Intent.EXTRA_EMAIL, getListView().getCheckedItemIds());
                    sendIntent.setType("text/plain");
                    startActivity(sendIntent);

Java Solutions


Solution 1 - Java

this is the code for sharing file in android

Intent intentShareFile = new Intent(Intent.ACTION_SEND);
File fileWithinMyDir = new File(myFilePath);

if(fileWithinMyDir.exists()) {
    intentShareFile.setType("application/pdf");
    intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+myFilePath));

    intentShareFile.putExtra(Intent.EXTRA_SUBJECT,
						"Sharing File...");
    intentShareFile.putExtra(Intent.EXTRA_TEXT, "Sharing File...");

    startActivity(Intent.createChooser(intentShareFile, "Share File"));
}

Below is another method to share PDF file if you have put file provider in manifest

Uri pdfUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        pdfUri = FileProvider.getUriForFile(PDFViewerActivity.this, fileprovider, pdfFile);
} else {
        pdfUri = Uri.fromFile(pdfFile);
}
Intent share = new Intent();
share.setAction(Intent.ACTION_SEND);
share.setType("application/pdf");
share.putExtra(Intent.EXTRA_STREAM, pdfUri);
startActivity(Intent.createChooser(share, "Share file"));

Solution 2 - Java

sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(exportPath));

also you can make zip file of all file and attach zip file for send multiple file in android

Solution 3 - Java

This is work for every single file!

private void shareFile(File file) {
    
    Intent intentShareFile = new Intent(Intent.ACTION_SEND);
    
    intentShareFile.setType(URLConnection.guessContentTypeFromName(file.getName()));
    intentShareFile.putExtra(Intent.EXTRA_STREAM,
        Uri.parse("file://"+file.getAbsolutePath()));

    //if you need
    //intentShareFile.putExtra(Intent.EXTRA_SUBJECT,"Sharing File Subject);
    //intentShareFile.putExtra(Intent.EXTRA_TEXT, "Sharing File Description");
    
    startActivity(Intent.createChooser(intentShareFile, "Share File"));
    
}

Thanks Tushar-Mate!

Solution 4 - Java

For those who trying in Kotlin here is the way:

Start the intent like below:

 fun startFileShareIntent(filePath: String) { // pass the file path where the actual file is located.
        val shareIntent = Intent(Intent.ACTION_SEND).apply {
            type = FILE_TYPE  // "*/*" will accepts all types of files, if you want specific then change it on your need.
            flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
            flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
            putExtra(
                Intent.EXTRA_SUBJECT,
                "Sharing file from the AppName"
            )
            putExtra(
                Intent.EXTRA_TEXT,
                "Sharing file from the AppName with some description"
            )
            val fileURI = FileProvider.getUriForFile(
                context!!, context!!.packageName + ".provider",
                File(filePath)
            )
            putExtra(Intent.EXTRA_STREAM, fileURI)
        }
        startActivity(shareIntent)
    }

In Manifest inside the application tag:

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

Under res-->xml--> provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="files" path="." />
    <external-path name="external_files" path="."/>
</paths>

Solution 5 - Java

First you should define File Provider, see https://medium.com/@ali.dev/open-a-file-in-another-app-with-android-fileprovider-for-android-7-42c9abb198c1.

The code checks that a device contains applications which can receive the file, see https://stackoverflow.com/questions/15407502/how-to-check-if-an-intent-can-be-handled-from-some-activity.

fun sharePdf(file: File, context: Context) {
    val uri = getUriFromFile(file, context)

    if (uri != null) {
        val intent = Intent().apply {
            action = Intent.ACTION_SEND
            type = "application/pdf" // For PDF files.
            putExtra(Intent.EXTRA_STREAM, uri)
            putExtra(Intent.EXTRA_SUBJECT, file.name)
            putExtra(Intent.EXTRA_TEXT, file.name)
            // Grant temporary read permission to the content URI.
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        }
        // Validate that the device can open your File.
        val activityInfo = intent.resolveActivityInfo(context.packageManager, intent.flags)
        if (activityInfo?.exported == true) {
            context.startActivity(Intent.createChooser(intent,
                "Share PDF file")
        }
    }
}

fun getUriFromFile(file: File, context: Context): Uri? =
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        Uri.fromFile(file)
    } else {
        try {
            FileProvider.getUriForFile(context, context.packageName + ".provider", file)
        } catch (e: Exception) {
            throw if (e.message?.contains("ProviderInfo.loadXmlMetaData") == true) {
                Error("FileProvider is not set or doesn't have needed permissions")
            } else {
                e
            }
        }
    }

Solution 6 - Java

Here is an example to share or save a text file:

private void shareFile(String filePath) {

    File f = new File(filePath);

    Intent intentShareFile = new Intent(Intent.ACTION_SEND);
    File fileWithinMyDir = new File(filePath);

    if (fileWithinMyDir.exists()) {
        intentShareFile.setType("text/*");
        intentShareFile.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + filePath));
        intentShareFile.putExtra(Intent.EXTRA_SUBJECT, "MyApp File Share: " + f.getName());
        intentShareFile.putExtra(Intent.EXTRA_TEXT, "MyApp File Share: " + f.getName());

        this.startActivity(Intent.createChooser(intentShareFile, f.getName()));
    }
}

Solution 7 - Java

File directory = new File(Environment.getExternalStorageDirectory() + File.separator + BuildConfig.APPLICATION_ID + File.separator + DIRECTORY_VIDEO);
            String fileName = mediaModel.getContentPath().substring(mediaModel.getContentPath().lastIndexOf('/') + 1, mediaModel.getContentPath().length());
            File fileWithinMyDir = new File(directory, fileName);
            if (fileWithinMyDir.exists()) {
                Uri fileUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", fileWithinMyDir);
                Intent intent = ShareCompat.IntentBuilder.from(this)
                        .setStream(fileUri) // uri from FileProvider
                        .setType("text/html")
                        .getIntent()
                        .setAction(Intent.ACTION_SEND) //Change if needed
                        .setDataAndType(fileUri, "video/*")
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                startActivity(intent);

Solution 8 - Java

Use ACTION_SEND_MULTIPLE for delivering multiple data to someone

intent.setAction(Intent.ACTION_SEND_MULTIPLE);
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, arrayUri);
intent.setType("text/plain");
startActivity(intent);

The arrayUri is the Array List of Uri of files to Send.

Solution 9 - Java

val uriArrayList: ArrayList<Uri> = ArrayList()
GlobalScope.launch(Dispatchers.IO) {
    runCatching {
        itemsList!!.forEach {
            uriArrayList.add(
                FileProvider.getUriForFile(
                    mContext,
                    APPLICATION_ID + ".provider",
                    File(it.path)
                )
            )
        }

    }.onSuccess {
        requireActivity().runOnUiThread {
            if (uriArrayList.size > 0) {
                val intent = Intent()
                intent.action = Intent.ACTION_SEND_MULTIPLE
                intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriArrayList)
                intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
                intent.type = "image/*|application/pdf/*"
                startActivity(Intent.createChooser(intent, resources.getString(R.string.share)))
            }
        }
    }
        .onFailure {
            Log.e("SHARING_FAILED", it)
        }
}

First of all you have to write provider code in app manifest file for sharing on android 7.0 and above

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

here provider_paths are:

    <?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="/storage/emulated/0" path="."/>
    <root-path name="root" path="." />
    <files-path name="files" path="."/>
</paths>

Solution 10 - Java

Read this article about Sending Content to Other Apps

Intent sendIntent = new Intent();

sendIntent.setAction(Intent.ACTION_SEND);

sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");

sendIntent.setType("text/plain");

startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser2351234View Question on Stackoverflow
Solution 1 - JavaTushar MateView Answer on Stackoverflow
Solution 2 - JavaDigvesh PatelView Answer on Stackoverflow
Solution 3 - JavaJavad BView Answer on Stackoverflow
Solution 4 - JavaShailendra MaddaView Answer on Stackoverflow
Solution 5 - JavaCoolMindView Answer on Stackoverflow
Solution 6 - Javalive-loveView Answer on Stackoverflow
Solution 7 - JavaAlok SinghView Answer on Stackoverflow
Solution 8 - JavaArun CView Answer on Stackoverflow
Solution 9 - JavaAbdur RehmanView Answer on Stackoverflow
Solution 10 - JavaPachuco DigitalView Answer on Stackoverflow