相关疑难解决方法(0)

从内部存储创建和共享文件

我的目标是在内部存储上创建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 android-contentprovider android-file

41
推荐指数
3
解决办法
4万
查看次数

为什么Intent.createChooser()需要一个BroadcastReceiver以及如何实现?

从我的实现中调用的以下代码段onOptionsItemSelected()可以很好地将用户从我的应用程序带到邮件客户端,邮件地址,主题和正文已预先填好.我正在使用它作为一种让用户给我反馈的简单方法.

String uriText =
    "mailto:" + emailAddress +
    "?subject=" + subject +
    "&body=" + body;

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uriText));
startActivity(Intent.createChooser(emailIntent, "Pick an email app:"));
Run Code Online (Sandbox Code Playgroud)

当邮件应用程序打开时(在我的带有Android 4.0.4的Nexus S上),LogCat输出以下内容,我无法弄清楚原因; Google和SO搜索createChooser unregisterReceiver看起来毫无结果,我找不到很多这样的例子createChooser()也会unregisterReceiver()以一种帮助这种情况的方式调用.

04-08 21:26:19.094:E/ActivityThread(27894):活动com.android.internal.app.ChooserActivity泄露了最初在这里注册的IntentReceiver com.android.internal.app.ResolverActivity$1@4150aac8.你是否错过了对unregisterReceiver()的调用?

04-08 21:26:19.094:E/ActivityThread(27894):android.app.IntentReceiverLeaked:Activity com.android.internal.app.ChooserActivity泄露了最初的IntentReceiver com.android.internal.app.ResolverActivity$1@4150aac8在这里注册.你是否错过了对unregisterReceiver()的调用?

04-08 21:26:19.094:E/ActivityThread(27894):在android.app.LoadedApk $ ReceiverDispatcher.(LoadedApk.java:763)

这感觉就像一个Android bug,因为我自己的代码没有调用registerReceiver(),所以为什么Android抱怨我需要调用unregisterReceiver()

android broadcastreceiver android-intent

13
推荐指数
1
解决办法
1万
查看次数