我的目标是在内部存储上创建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) 我的应用程序创建带附件的邮件,并使用意图Intent.ACTION_SEND来启动邮件应用程序.
它适用于我测试过的所有邮件应用,除了新的Gmail 5.0(适用于Gmail 4.9),邮件打开时没有附件,显示错误:"附件权限被拒绝".
在logcat上没有来自Gmail的有用消息.我只测试了Android KitKat上的Gmail 5.0,但是在多个设备上.
我为附件创建了这样的文件:
String fileName = "file-name_something_like_this";
FileOutputStream output = context.openFileOutput(
fileName, Context.MODE_WORLD_READABLE);
// Write data to output...
output.close();
File fileToSend = new File(context.getFilesDir(), fileName);
Run Code Online (Sandbox Code Playgroud)
我知道安全问题MODE_WORLD_READABLE.
我发送这样的意图:
public static void compose(
Context context,
String address,
String subject,
String body,
File attachment) {
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("message/rfc822");
emailIntent.putExtra(
Intent.EXTRA_EMAIL, new String[] { address });
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
emailIntent.putExtra(
Intent.EXTRA_STREAM,
Uri.fromFile(attachment));
Intent chooser = Intent.createChooser(
emailIntent,
context.getString(R.string.send_mail_chooser));
context.startActivity(chooser);
}
Run Code Online (Sandbox Code Playgroud)
在创建文件或发送意图时,我有什么问题吗?有没有更好的方法来启动带附件的邮件应用程序?或者 …
有两个要求:
Intent选择器中,应该只有电子邮件应用程序.我所知道/做过的事:
Intent.ACTION_SENDTO与intent.setData(Uri.parse("mailto:"))可以确保有只在电子邮件应用程序Intent选择器,但它不会带来附件(如Gmail它将一些应用程序,但也有将忽略附着许多应用程序).
Intent.ACTION_SEND可以发送附件的电子邮件.但是,在Intent选择器中,会有应用程序实际上不是电子邮件应用程序但可以响应Intent.ACTION_SEND.使用intent.setType("message/rfc822")可以减少这些应用程序的数量,但不是全部.
参考这个答案:https://stackoverflow.com/a/8550043/3952691并且几乎成功实现了我的目标.我的代码如下:
private static void sendFeedbackWithAttachment(Context context, String subject) {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0);
if (resolveInfos.isEmpty()) {
Toast.makeText(context, context.getString(R.string.error_activity_not_found),
Toast.LENGTH_SHORT).show();
} else {
// ACTION_SEND may be replied by some apps that are not email apps. However,
// ACTION_SENDTO doesn't allow us to choose attachment. As …Run Code Online (Sandbox Code Playgroud)在我的应用程序中,一些联系人被附加到单个.vcf文件并且该文件发送到邮件,尝试在log cat中显示所有联系人数据,但是无法发送附加到单个.vcf文件的所有数据?
任何人都有这个帮助我的想法,请.
这是我的代码
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
vCard = new ArrayList<String>();
Log.i("TAG one", "vfile" +vfile);
vfile = "Contacts" + "_" + System.currentTimeMillis() + ".vcf";
/**
* This Function For Vcard And here i take one Array List in Which i
* store every Vcard String of Every Contact Here i take one Cursor and
* this cursor is not null and its count>0 than i repeat one loop up to
* cursor.getcount() means Up …Run Code Online (Sandbox Code Playgroud) 我正在使用slf4android(https://github.com/bright/slf4android)编写日志,但是如何阅读它们并不明显(理想情况下我只想将它们下载到我的计算机上).其他应用无法访问该应用的内部存储空间.我可以配置slf4android来登录共享目录吗?我试过这个,但我得到了通知:
FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this);
File lol = this.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
fileHandler.setFullFilePathPattern(fileHandler.toString() + "/my_log.%g.%u.log");
LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler);
Run Code Online (Sandbox Code Playgroud)