我的目标是在内部存储上创建XML文件,然后通过共享Intent发送它.
我可以使用此代码创建XML文件
FileOutputStream outputStream = context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
PrintStream printStream = new PrintStream(outputStream);
String xml = this.writeXml(); // get XML here
printStream.println(xml);
printStream.close();
Run Code Online (Sandbox Code Playgroud)
我试图将Uri检索到输出文件以便共享它.我首先尝试通过将文件转换为Uri来访问该文件
File outFile = context.getFileStreamPath(fileName);
return Uri.fromFile(outFile);
Run Code Online (Sandbox Code Playgroud)
这将返回file:///data/data/com.my.package/files/myfile.xml但我似乎无法将其附加到电子邮件,上传等.
如果我手动检查文件长度,它是正确的,并显示有一个合理的文件大小.
接下来,我创建了一个内容提供程序并尝试引用该文件,它不是该文件的有效句柄.在ContentProvider没有以往任何时候都似乎被称为任意点.
Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + fileName);
return uri;
Run Code Online (Sandbox Code Playgroud)
这将返回内容://com.my.package.provider/myfile.xml但我检查文件并且它的长度为零.
如何正确访问文件?我是否需要使用内容提供商创建文件?如果是这样,怎么样?
更新
这是我用来分享的代码.如果我选择Gmail,它会显示为附件,但是当我发送它时会出现错误无法显示附件,并且到达的电子邮件没有附件.
public void onClick(View view) {
Log.d(TAG, "onClick " + view.getId());
switch (view.getId()) {
case R.id.share_cancel:
setResult(RESULT_CANCELED, getIntent());
finish();
break;
case R.id.share_share:
MyXml …Run Code Online (Sandbox Code Playgroud) 在新的Android KitKat设备上运行我的应用程序(API 19,4.4)每当我尝试创建一个Intent选择器时,我都会"复制到剪贴板".这是在Youtube,Tumblr以及Android KitKat上的各种其他应用程序中发生的.查看日志我看到以下异常:
com.android.internal.app.ChooserActivity泄露了IntentReceiver com.android.internal.app.ResolverActivity$1@4150aac8
这曾经是设备没有多个Intent应用程序时出现的问题(请参阅为什么Intent.createChooser()需要BroadcastReceiver以及如何实现?).但是,我的设备不是这种情况.似乎Android API 19中的某些内容已被破坏.
E/ActivityThread( 655): Activity com.android.internal.app.ChooserActivity has
leaked IntentReceiver com.android.internal.app.ResolverActivity$1@412f4f38
that was originally registered here.
Are you missing a call to unregisterReceiver()? E/ActivityThread( 655):
android.app.IntentReceiverLeaked:
Activity com.android.internal.app.ChooserActivity has leaked IntentReceiver
com.android.internal.app.ResolverActivity$1@412f4f38 that was originally
registered here. Are you missing a call to unregisterReceiver()?
Run Code Online (Sandbox Code Playgroud)
当我在此处发布的例程后从手机图库中选择图像时,会发生这种情况.正是当我按下活动布局中定义的浏览图库按钮时.
完整的LOGCAT:
E/ActivityThread( 655): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:763)
E/ActivityThread( 655): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
E/ActivityThread( 655): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1043)
E/ActivityThread( 655): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1030)
E/ActivityThread( 655): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1024)
E/ActivityThread( 655): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
E/ActivityThread( 655): at com.android.internal.content.PackageMonitor.register(PackageMonitor.java:65)
E/ActivityThread( 655): at com.android.internal.app.ResolverActivity.onCreate(ResolverActivity.java:99) …Run Code Online (Sandbox Code Playgroud)