如何发送(分享)csv文件?

问题描述 投票:0回答:1

如何发送(分享)*csv 文件?

我有一个 Android 应用程序,它会创建一个 csv 文件。我想分享它:发送到电子邮件、在 Excel 中打开等等。 我阅读了教程:设置文件共享共享文件,但无法理解:这是否适合我的选择?

我声明清单:

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

但是接下来我应该做什么?

你能告诉我一些简单的代码示例(也许是 git-repo)如何将文件共享到其他应用程序吗? 谢谢!

编辑:我编写了一些新代码来共享文件(查看

FileProvider
示例)

public class ExportActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_export);

    Intent intentShareFile = new Intent(Intent.ACTION_SEND);
    intentShareFile.setAction(Intent.ACTION_SEND);        
    File imagePath = new File(getApplicationContext().getFilesDir(), "statistics");
    File newFile = new File(imagePath, "stat.csv");
    CSVHelper csvHelper = new CSVHelper(SharedData.AllPlayersColl);
    try {
        String path=imagePath.getAbsolutePath();
        csvHelper.SaveToCSV(path);
    } catch (IOException e) {
        e.printStackTrace();
    }

    Context context=getApplicationContext();
    Uri contentUri = getUriForFile(context, "com.name1.name2.fileprovider", newFile);

    List<ResolveInfo> resInfoList = getApplicationContext().getPackageManager()
            .queryIntentActivities(intentShareFile, PackageManager.MATCH_DEFAULT_ONLY);
    for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        getApplicationContext()
                .grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }

    intentShareFile.setData(contentUri);
    intentShareFile.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    setResult(100, intentShareFile);
    startActivityForResult(intentShareFile,100);
  }
}

哪里

CSVHelper
是:

 fun SaveToCSV(fileName: String?) {
    if (fileName == null)
        throw NullPointerException("fileName is null!")

    val writer = CSVWriter(FileWriter(fileName), '\t')

      // make csv file
       writer.writeNext(firstLine);
  }

并且

filepaths
是:

   <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
    <files-path name="stat" path="statistics/"  />
</paths>

但是,我收到错误:

          Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.SEND dat=content://com.name1.name2.fileprovider/stat/stat.csv flg=0x2 }

我希望,当我启动

Intent
时,会显示变体列表(在 Android 设备上):email_app、excel_app 等。所以,我想发送 noname 意图。

android csv android-activity share
1个回答
1
投票

FileProvider
是一个帮助程序类,旨在将文件共享为
content://
URI,而不是
file://
URI,后者已被弃用一段时间并自 API 级别 24 起被禁止。

您已经声明了内容提供者,现在需要对其进行配置,即选择它可以提供哪些文件。这是在您在元数据中声明的

xml/filepath
文件中完成的。然后,您将能够使用
FileProvider.getUriForFile()
.

生成可共享内容 URI。

有一个完整的总结

不幸的是,并非所有应用程序都能理解

content://
URI。如果您需要与仅处理
file://
URI 的(非常旧或写得不好的)应用程序共享文件,如果您将应用程序的目标级别设置为 23 或更低,您仍然可以使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.