android - 将 pdf 附加到电子邮件,授予权限

标签 android android-intent file-permissions email-attachments outputstream

如果我授予 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();

Intent

// 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);

list

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

最佳答案

FLAG_GRANT_*_URI_PERMISSION(用于 READWRITE)实际上是用于 Uri 来自您自己的地方内容提供者。如果您想避免需要 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,一个关键区别在于您授予权限的方式。 FLAG_GRANT_ 忽略了 extras 中的 Uri 值*_URI_PERMISSION 在 Android 4.4 及以下版本。对于这些版本,我所知道的唯一解决方案是手动向每个可能的应用程序授予权限(在您的情况下,每个 PDF 查看器)。

this sample app ,我使用 ACTION_IMAGE_CAPTURE 拍照,并为此使用 FileProvider Uri(因为 file Uri 值为 going away )。就像您将 EXTRA_STREAMUri 一起使用一样,我正在使用 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)

因此,我授予任何 ACTION_IMAGE_CAPTUREIntent在 Android 4.4 及更早版本上使用此Uri` 的权利。

关于android - 将 pdf 附加到电子邮件,授予权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533267/

相关文章:

android - 使用 Intent 将字符串返回到先前的 Activity

android - 使用 for 循环访问 ImageView 数组

android - 服务在特定时间运行 Android

linux - 如何从文本文件中获取文件路径并在 bash 中执行操作

macos - 在 Mac 上使用 compass 的权限问题

android - NullpointerException 在 LinkedHashMap 上使用 put 方法

android - 如何删除固定的快捷方式?

java - 读/写具有特殊字符的 .txt 文件

android - 如何使用 Jenkins Git Publisher

linux - Laravel 无法使用权​​限 775 写入/存储 - Amazon AWS Linux