Android 将uri发送到文本编辑器应用程序并保存它
从概念上讲,我希望做的是将资源uri(引用我的内容提供商(CP))从我的应用程序(a)发送到文本编辑器应用程序(B)(用户选择)以便文本编辑器以文本流的形式访问uri,并能够编辑和保存文件。从文本编辑器(B)返回一些通知是可取的,但我可能能够使用CP来意识到“写” 意图和CP是否支持这种级别的交互 本质上,我不想在我的应用程序中编写我自己的文本编辑器——我的应用程序管理数据(通过内容提供商),文本编辑器进行操作Android 将uri发送到文本编辑器应用程序并保存它,android,android-intent,android-contentprovider,Android,Android Intent,Android Contentprovider,从概念上讲,我希望做的是将资源uri(引用我的内容提供商(CP))从我的应用程序(a)发送到文本编辑器应用程序(B)(用户选择)以便文本编辑器以文本流的形式访问uri,并能够编辑和保存文件。从文本编辑器(B)返回一些通知是可取的,但我可能能够使用CP来意识到“写” 意图和CP是否支持这种级别的交互 本质上,我不想在我的应用程序中编写我自己的文本编辑器——我的应用程序管理数据(通过内容提供商),文本编辑器进行操作 可能是将数据发送到临时外部存储位置并将文件路径发送到编辑器,但这似乎比需要的更复杂。
可能是将数据发送到临时外部存储位置并将文件路径发送到编辑器,但这似乎比需要的更复杂。我最终使用了FileProvider类并浏览了支持文档,得到了以下代码。不完全是我最初打算做的,但概念上结果是相同的(用户按下按钮-编辑文件/保存-用户返回应用程序): (在AndroidManifest.xml中>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="my.package.name.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
在res/xml/file_path.xml中:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="notes" path="notes/"/>
</paths>
在按钮侦听器中(用户希望看到/编辑其注释):
私有类AddNoteListener实现View.OnClickListener{
@凌驾
公共void onClick(视图v){
File notesPath=新文件(context.getFilesDir(),“notes”);
if(notesPath.exists()==false){
notesPath.mkdir();
}
File newFile=新文件(notesPath,“my_note.txt”);
试一试{
if(newFile.exists()==false){
createNewFile();
}
Uri contentUri=FileProvider.getUriForFile(上下文“my.package.name.FileProvider”,newFile);
意向意向=新意向(意向.行动\编辑);
setDataAndType(contentUri,“text/plain”);
intent.addFlags(intent.FLAG_GRANT_READ_URI_PERMISSION | intent.FLAG_GRANT_WRITE_URI_PERMISSION);
List resinfo List=context.getPackageManager().queryInputActivities(intent,PackageManager.MATCH_DEFAULT_仅限);
对于(ResolveInfo ResolveInfo:ResInfo列表){
字符串packageName=resolveInfo.activityInfo.packageName;
grantUriPermission(packageName、contentUri、Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
context.startActivity(Intent.createChooser(Intent,“Title”));
}捕获(ioe异常ioe){
e、 printStackTrace();
}
}
}
参考资料:
private class AddNoteListener implements View.OnClickListener {
@Override
public void onClick(View v) {
File notesPath = new File(context.getFilesDir(), "notes");
if (notesPath.exists() == false) {
notesPath.mkdir();
}
File newFile = new File(notesPath, "my_note.txt");
try {
if (newFile.exists() == false) {
newFile.createNewFile();
}
Uri contentUri = FileProvider.getUriForFile(context, "my.package.name.fileprovider", newFile);
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setDataAndType(contentUri, "text/plain");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
context.grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
context.startActivity(Intent.createChooser(intent,"Title"));
} catch (IOException ioe) {
e.printStackTrace();
}
}
}