为什么我无法发送存储在应用内部存储中的文本文件?

时间:2017-01-26 13:40:37

标签: android android-intent android-fileprovider

我有一个应用程序说(应用程序A),其中我已通过代码在内部存储(data / data / com.example.mockapp / files)中存储了一个文本文件(testfile.txt)。

// Create a file in the Internal Storage
        String content = "hello world";
        String filename="testfile.txt";
        File file = null;
        FileOutputStream outputStream;
        try {
            file = new File(getFilesDir(), filename);
            outputStream = new FileOutputStream(file);
            outputStream.write(content.getBytes());
            outputStream.close();
        } catch (IOException e) {
            Log.d("InternalfileException", "we are here in exception");
            e.printStackTrace();
        }

确认文件已成功创建且存在(我已检查过)

注意:使用文件提供程序共享文本文件。

// XML

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

//清单

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.mock.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>

//这是主要活动的代码发送意图

Uri uri = FileProvider.getUriForFile(this, "com.example.mock.fileprovider", file);
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(Intent.createChooser(intent, null));

现在,当我启动应用时,会弹出带有watsapp,gmail,message等的选择器对话框,但是

当我点击它们中的任何一个时它只显示..

1)如果是watsapp - 显示txt文件,但它永远不会完成上传

2)如果是gmail - 显示txt文件永远不会作为附件附加,则会发送空邮件。

我错过了什么?

直到现在,这让我发疯了。

请帮助..

2 个答案:

答案 0 :(得分:0)

这与file permissions有关,将其整理出来。 尝试提供适当的read write权限,以便实现此目的。还要确保 您正确地在manifest中声明文件提供程序。

谢谢!

答案 1 :(得分:0)

我遇到了同样的问题,最后我在此页面找到了解决方案: https://jayrambhia.com/blog/android-fileprovider-ecosystem

这是对我有用的代码。这是在 Kotlin 中完成的,但非常相似:

//name of document
                val nombre = getString(R.string.app_name).replace(" ", "_")

                //saving document in internal storage
                contexto!!.openFileOutput("$nombre.txt", Context.MODE_PRIVATE).use {
                    it.write("holita".toByteArray())
                }

                //Generation Uri
                val path = FileProvider.getUriForFile(
                    contexto!!,
                    "${BuildConfig.APPLICATION_ID}.provider",
                    File(contexto!!.filesDir, "My_Password_Saver.txt")
                )

                //Sharing document
                val shareIntent: Intent = Intent().apply {
                    action = Intent.ACTION_SEND
                    addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                    putExtra(Intent.EXTRA_STREAM, path)
                    type = "text/plain"
                }

                startActivity(Intent.createChooser(shareIntent, "Enviar"))