我的目标是在内部存储上创建一个 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();
我一直在尝试将 Uri 检索到输出文件以共享它。我首先尝试通过将文件转换为 Uri 来访问该文件
File outFile = context.getFileStreamPath(fileName);
return Uri.fromFile(outFile);
这将返回file:///data/data/com.my.package/files/myfile.xml但我似乎无法将其附加到电子邮件、上传等。
如果我手动检查文件长度,它是正确的,并显示有一个合理的文件大小。
接下来,我创建了一个内容提供程序并尝试引用该文件,但它不是该文件的有效句柄。ContentProvider
似乎从来没有被称为任何点。
Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + fileName);
return uri;
这将返回content://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 xml = new MyXml();
Uri uri;
try {
uri = xml.writeXmlToFile(getApplicationContext(), "myfile.xml");
//uri is "file:///data/data/com.my.package/files/myfile.xml"
Log.d(TAG, "Share URI: " + uri.toString() + " path: " + uri.getPath());
File f = new File(uri.getPath());
Log.d(TAG, "File length: " + f.length());
// shows a valid file size
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("text/plain");
startActivity(Intent.createChooser(shareIntent, "Share"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
break;
}
}
我注意到createChooser(...)Exception
里面有一个抛出,但我不知道为什么抛出它。
E/ActivityThread(572): Activity com.android.internal.app.ChooserActivity 泄露了最初在这里注册的 IntentReceiver com.android.internal.app.ResolverActivity$1@4148d658。您是否错过了对 unregisterReceiver() 的调用?
我研究了这个错误,找不到任何明显的东西。这两个链接都表明我需要注销接收器。
我有一个接收器设置,但它AlarmManager
是在其他地方设置的,不需要应用程序注册/取消注册。
openFile(...) 的代码
如果需要,这里是我创建的内容提供者。
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
String fileLocation = getContext().getCacheDir() + "/" + uri.getLastPathSegment();
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(fileLocation), ParcelFileDescriptor.MODE_READ_ONLY);
return pfd;
}