将 pdf 附加到电子邮件,授予权限
Attach a pdf to email, grant permission
如果我授予 READ_EXTERNAL_STORAGE
权限一切正常,但我可以不问就让它工作吗?它在我的模拟器上没有它也能工作,但在真实设备上没有它就不能工作。
输出流
String fileName = "Körjorunal_" + lastUpdateTime + ".PDF";
String path = Environment.getExternalStorageDirectory().toString();
File file = new File(path, fileName)
pdfUri = Uri.fromFile(file);
OutputStream outputStream = new FileOutputStream(file);
document.writeTo(outputStream);
document.close();
outputStream.close();
意图
// Gets invoked on setup,
mShareIntent = new Intent();
mShareIntent.setAction(Intent.ACTION_SEND);
mShareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
mShareIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Creates document type.
mShareIntent.setType("application/pdf");
// Going via email:
mShareIntent.putExtra(Intent.EXTRA_SUBJECT, "Körjournal i bifogad PDF");
// Attach the PDf Uri.
mShareIntent.putExtra(Intent.EXTRA_STREAM, pdfUri);
mShareActionProvider.setShareIntent(mShareIntent);
清单
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
未经许可,您不能使用该功能。
如果您使用的是 Marshmallow 之前的 Android 版本,您只需将权限添加到 Manifest,它就不会再要求它了。
但是 Marshmallow 将权限分类为 Normal and Dangerous permissions。您必须在用户使用该功能之前请求危险权限。
FLAG_GRANT_*_URI_PERMISSION
(对于 READ
和 WRITE
)实际上是为了 Uri
来自您自己的 ContentProvider
。如果你想避免需要 WRITE_EXTERNAL_STORAGE
(和多余的 READ_EXTERNAL_STORAGE
)权限:
步骤#1:将文件写入internal storage,如getCacheDir()
第 2 步:使用 FileProvider
从内部存储提供该文件
第 3 步:使用您现有的 ACTION_SEND
逻辑,替换您从 FileProvider
获得的 Uri
您将在 this sample project 中看到该模式。我的示例是针对 ACTION_VIEW
,而不是 ACTION_SEND
,但除此之外它是一个接近的匹配项。
不过,如果您的 minSdkVersion
低于 21,则一个关键区别在于您授予权限的方式。Uri
extras 中的值被 FLAG_GRANT_*_URI_PERMISSION
在 Android 4.4 及以下。对于这些版本,我知道的唯一解决方案是手动向每个可能的应用程序授予权限(在您的情况下,每个 PDF 查看器)。
在this sample app, I use ACTION_IMAGE_CAPTURE
to take a picture, and I use a FileProvider
Uri
for that (since file
Uri
values are going away)。正如你使用 EXTRA_STREAM
和 Uri
,我使用 EXTRA_OUTPUT
,所以我 运行 进入相同的 Uri
-in-an-an-extra 权限问题。因此,我经历了所有这些混乱:
i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
else {
List<ResolveInfo> resInfoList=
getPackageManager()
.queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, outputUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
startActivityForResult(i, CONTENT_REQUEST);
(这里,i
是我的ACTION_IMAGE_CAPTURE
Intent
)
因此,我在 Android 4.4 及更早版本上授予任何 ACTION_IMAGE_CAPTURE
Intentthe rights to work with this
Uri`。
如果我授予 READ_EXTERNAL_STORAGE
权限一切正常,但我可以不问就让它工作吗?它在我的模拟器上没有它也能工作,但在真实设备上没有它就不能工作。
输出流
String fileName = "Körjorunal_" + lastUpdateTime + ".PDF";
String path = Environment.getExternalStorageDirectory().toString();
File file = new File(path, fileName)
pdfUri = Uri.fromFile(file);
OutputStream outputStream = new FileOutputStream(file);
document.writeTo(outputStream);
document.close();
outputStream.close();
意图
// Gets invoked on setup,
mShareIntent = new Intent();
mShareIntent.setAction(Intent.ACTION_SEND);
mShareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
mShareIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Creates document type.
mShareIntent.setType("application/pdf");
// Going via email:
mShareIntent.putExtra(Intent.EXTRA_SUBJECT, "Körjournal i bifogad PDF");
// Attach the PDf Uri.
mShareIntent.putExtra(Intent.EXTRA_STREAM, pdfUri);
mShareActionProvider.setShareIntent(mShareIntent);
清单
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
未经许可,您不能使用该功能。
如果您使用的是 Marshmallow 之前的 Android 版本,您只需将权限添加到 Manifest,它就不会再要求它了。
但是 Marshmallow 将权限分类为 Normal and Dangerous permissions。您必须在用户使用该功能之前请求危险权限。
FLAG_GRANT_*_URI_PERMISSION
(对于 READ
和 WRITE
)实际上是为了 Uri
来自您自己的 ContentProvider
。如果你想避免需要 WRITE_EXTERNAL_STORAGE
(和多余的 READ_EXTERNAL_STORAGE
)权限:
步骤#1:将文件写入internal storage,如getCacheDir()
第 2 步:使用 FileProvider
第 3 步:使用您现有的 ACTION_SEND
逻辑,替换您从 FileProvider
Uri
您将在 this sample project 中看到该模式。我的示例是针对 ACTION_VIEW
,而不是 ACTION_SEND
,但除此之外它是一个接近的匹配项。
不过,如果您的 minSdkVersion
低于 21,则一个关键区别在于您授予权限的方式。Uri
extras 中的值被 FLAG_GRANT_*_URI_PERMISSION
在 Android 4.4 及以下。对于这些版本,我知道的唯一解决方案是手动向每个可能的应用程序授予权限(在您的情况下,每个 PDF 查看器)。
在this sample app, I use ACTION_IMAGE_CAPTURE
to take a picture, and I use a FileProvider
Uri
for that (since file
Uri
values are going away)。正如你使用 EXTRA_STREAM
和 Uri
,我使用 EXTRA_OUTPUT
,所以我 运行 进入相同的 Uri
-in-an-an-extra 权限问题。因此,我经历了所有这些混乱:
i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
else {
List<ResolveInfo> resInfoList=
getPackageManager()
.queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, outputUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION |
Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
}
startActivityForResult(i, CONTENT_REQUEST);
(这里,i
是我的ACTION_IMAGE_CAPTURE
Intent
)
因此,我在 Android 4.4 及更早版本上授予任何 ACTION_IMAGE_CAPTURE
Intentthe rights to work with this
Uri`。