我无法为我创建的应用程序授予“反向权限” 希望以受控方式提供敏感数据。
我的应用程序是一个时间跟踪器,因为时间跟踪日志 可以被认为是个人信息,我已经创建了权限 用于访问它并为其分配 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 mPreAuthorizedUris
在 query/update/...
-methods 中使用。
该调用的返回值被放入 Intent 中,然后使用。
关于android - 将敏感的应用程序数据作为电子邮件附件发送时,正确的权限处理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4179594/