如何发送(共享)csv 文件?
How to send(share) csv file?
如何发送(分享)*csv文件?
我有 android 应用程序,可以创建一个 csv 文件。我想分享它:发送到电子邮件,在 excel 打开等等。
我读了教程:set up file sharing and sharing a file,但无法理解:是否适合我的选择?
我申报清单:
<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 意图。
FileProvider
是一个帮助程序 class,旨在将文件共享为 content://
URI,而不是 file://
URI,后者已被弃用一段时间并自 [=27] 起被禁止=] 24级.
您已经声明了内容提供者,现在需要对其进行配置,即选择它可以提供的文件。这是在您在元数据中声明的 xml/filepath
文件中完成的。然后,您将能够使用 FileProvider.getUriForFile()
.
生成可共享的内容 URI
有完整的wrap up
遗憾的是,并非所有应用程序都能理解 content://
URI。如果您需要与仅处理 file://
URI 的(非常旧或写得不好的)应用程序共享文件,如果您将应用程序的目标级别设置为 23 或更低,您仍然可以使用它们。
如何发送(分享)*csv文件?
我有 android 应用程序,可以创建一个 csv 文件。我想分享它:发送到电子邮件,在 excel 打开等等。 我读了教程:set up file sharing and sharing a file,但无法理解:是否适合我的选择?
我申报清单:
<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 意图。
FileProvider
是一个帮助程序 class,旨在将文件共享为 content://
URI,而不是 file://
URI,后者已被弃用一段时间并自 [=27] 起被禁止=] 24级.
您已经声明了内容提供者,现在需要对其进行配置,即选择它可以提供的文件。这是在您在元数据中声明的 xml/filepath
文件中完成的。然后,您将能够使用 FileProvider.getUriForFile()
.
有完整的wrap up
遗憾的是,并非所有应用程序都能理解 content://
URI。如果您需要与仅处理 file://
URI 的(非常旧或写得不好的)应用程序共享文件,如果您将应用程序的目标级别设置为 23 或更低,您仍然可以使用它们。