android - 将敏感的应用程序数据作为电子邮件附件发送时,正确的权限处理是什么?

标签 android

我无法为我创建的应用程序授予“反向权限” 希望以受控方式提供敏感数据。

我的应用程序是一个时间跟踪器,因为时间跟踪日志 可以被认为是个人信息,我已经创建了权限 用于访问它并为其分配 android.permission- group.PERSONAL_INFO 权限组。

要从手机导出时间日志,我添加了发送功能 日志作为电子邮件附件。附件由a生成 受我新添加的权限保护的内容提供者。我的 发送电子邮件的代码如下所示:

   String email = "someone@example.com";
   Uri uri = TimeLog.CSVAttachment.CONTENT_URI;
   Intent i = new Intent(Intent.ACTION_SEND, uri);
   i.setType("text/csv");
   i.putExtra(Intent.EXTRA_EMAIL, new String[]{email});
   i.putExtra(Intent.EXTRA_SUBJECT, "Time log");
   i.putExtra(Intent.EXTRA_TEXT, "Hello World!");
   i.putExtra(Intent.EXTRA_STREAM, uri);
   i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
   startActivity(i);

在我的 HTC 手机上运行它时,我会在 Gmail 之间弹出一个选择 和 HTC 邮件。选择 Gmail,我在 Gmail 应用程序中遇到此异常:

ERROR/AndroidRuntime(8169): Caused by: java.lang.SecurityException:
Permission Denial: reading com.mycompany.timelog.TimeLog uri
content://com.mycompany.timelog/csv_attachment from pid=8169,
uid=10035 requires com.mycompany.timelog.permission.READ_TIME_LOG

我确实在我的提供商上设置了 android:grantUriPermissions="true" 但是 那没有帮助。我有一个关于为什么会发生这种情况的理论。我有 期望 FLAG_GRANT_READ_URI_PERMISSION 赋予 Gmail 权利 访问我的内容提供者,但我认为真正发生的是 此权限授予 com.android.internal.app.ResolverActivity 因为有不止 Intent 和 Android 的一个匹配项创建了一个包装器 Activity 向用户显示选择。

因此,我尝试将其硬编码到我的应用程序中以进行测试:

   grantUriPermission("com.google.android.gm", uri,
       Intent.FLAG_GRANT_READ_URI_PERMISSION);

这允许 Gmail 正确显示电子邮件,我可以按 “发送”。不幸的是,在 GMail 关闭后,我在 com.google.process.gapps:

错误/AndroidRuntime(7617):java.lang.SecurityException:权限 拒绝:读取 com.mycompany.timelog.TimeLog uri content://com.mycompany.timelog/csv_attachment 来自 pid=7617, uid=10011 需要 com.mycompany.timelog.permission.READ_TIME_LOG

请注意,这是来自不同的 PID 和 UID。这是因为 对 openAssetFile 的实际调用是从某个同步提供程序发生的 属于不同包的组件 (com.google.android.googleapps?)。

虽然我希望最终找到一种授予权限的方法 到我的 ACTION_SEND Intent 的最终接收者,调用的事实 openAssetFile 发生在一些完全不同且实际上 不相关的包让我对如何授予权限感到困惑 应该工作。

所以最终我的问题是,鉴于日志是敏感数据, 我如何允许它作为附件通过电子邮件发送,同时尊重 用户的隐私(例如,不建立依恋世界 可读)?

最佳答案

亲爱的 future 的人们,

似乎连谷歌本身都以另一种方式解决了这个问题,这是我在尝试解决同样问题时偶然发现的。

如果您查看 com.android.contacts.detail.ContactLoaderFragment,您会在方法 private Uri getPreAuthorizedUri(Uri uri) 中找到:

mContext.getContentResolver().call(
            ContactsContract.AUTHORITY_URI,
            ContactsContract.Authorization.AUTHORIZATION_METHOD,
            null,
            uriBundle);

解析为 com.android.providers.contacts.ContactsProvider2,其中类似的 call 方法将 uri 添加到 map mPreAuthorizedUrisquery/update/...-methods 中使用。

该调用的返回值被放入 Intent 中,然后使用。

关于android - 将敏感的应用程序数据作为电子邮件附件发送时,正确的权限处理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4179594/

相关文章:

android - "No repository found"- 通过 Eclipse 更新 Android ADT

android - 如何降低 Android CameraX ImageAnalysis 的帧率?

安装在设备 : JSException: Can't find variable: Promise (RN 0. 57.1 中的 ANDROID 应用程序崩溃)

android - 如何将应用签名从V1升级到V2?

java - 了解 Java 中的泛型方法

java - Twitter4j 401 身份验证

java - 如何仅在特定时间调用函数

android - 执行 os 命令 python 后获取打印值

android - 无法从动态添加的复选框中获取值

android - 错误 - Android 资源链接失败(AAPT2 27.0.3 Daemon #0)