在我们的应用程序中,我们需要从电子邮件客户端读取附件并将其上载到服务器.对于默认的android电子邮件客户端一切正常,但面向gmail应用程序
java.lang.SecurityException: Permission Denial: opening provider com.google.android.gm.provider.MailProvider from ProcessRecord (pid=11298, uid=10068) requires com.google.android.gm.permission.READ_GMAIL or com.google.android.gm.permission.WRITE_GMAIL
Run Code Online (Sandbox Code Playgroud)
甚至尝试过授予Gmail读写权限但无效.
观察是
它适用于Nexus,但对于三星设备4.2和4.1,如果第一次创建活动,最初工作正常,但如果活动在背景中抛出上述异常.
尝试使用下面的代码获取附件文件名.
Cursor cursor = getContentResolver().query(openIntent.getData(),
new String[] { MediaStore.MediaColumns.DISPLAY_NAME }, null,
null, null);
cursor.moveToFirst();
int nameIndex = cursor
.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
if (nameIndex >= 0) {
NCUtil.clickedImageTitle = cursor.getString(nameIndex);
path = cursor.getString(nameIndex);
}
cursor.close();
Run Code Online (Sandbox Code Playgroud)
我的清单文件
<activity
android:name="com.ncomputing.vspacemobile.NCMainActivity"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:screenOrientation="sensorPortait"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="adjustPan" >
<!-- For email attachments -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/pdf" />
<data android:mimeType="application/msword" />
<data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
<data android:mimeType="application/vnd.ms-excel" />
<data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
<data android:mimeType="application/vnd.ms-powerpoint" />
<data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
<data android:mimeType="text/plain" />
<data android:mimeType="text/comma-separated-values" />
<data android:mimeType="application/rtf" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
用户权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Run Code Online (Sandbox Code Playgroud)
请告诉我们如何使其工作,我需要将活动启动模式作为singleTask并访问附件.
intent过滤器需要内容和文件方案类型,以及mimetype application/octetstream
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="file" android:pathPattern=".*\\.inform" android:mimeType="application/octet-stream"/>
<data android:scheme="content" android:pathPattern=".*\\.inform" android:mimeType="application/octet-stream"/>
Run Code Online (Sandbox Code Playgroud)
根据Android文档,"如果没有为intent过滤器指定方案,则忽略所有其他URI属性." 删除了scheme和URI属性后,过滤意图的唯一方法是使用Mime类型,我们都知道自定义文件扩展名没有注册的mime类型.
作为参考,URI的形式如下:
scheme://host:port/path
pathPrefix
pathPattern
Run Code Online (Sandbox Code Playgroud)
所以没有方案,所有这些都会下降.在发现上述内容之后,我尝试了显而易见的 - 使用"*"作为方案,甚至尝试了".*".这些都没有奏效.我希望其他人可以继承我的考验.但我认为这与选择正确的方案有关.不幸的是,我所知道的唯一方案是http https内容和文件,以上都不是神奇的子弹.
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/*" host="*" android:pathPattern=".*.ext" android:scheme="content" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
此意图将导致gmail显示"下载/预览"按钮.实际上,当.ext文件作为附件发送到常规电子邮件客户端时,这也会导致您的应用程序打开.
资源:
Android从gmail app获取附加文件名 Intent过滤器从Android上的gmail应用程序下载附件
当被调用应用程序的任务完成时,Android 的 ActivityManager 会自动清除每个 URI 的权限。由于每个 URI 权限通常是通过设置 授予的Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,因此当任务进入后台时,该任务将被清除(这样,如果从启动器再次启动 Gmail,您就不会打开附件查看器)。有关详细信息,请参阅文档。
这是设计使然,没有办法“让它发挥作用”。您必须构建您的应用程序以很好地适应此权限授予方案。您可以在应用程序启动时读取整个附件,转储到临时文件/数据库并使用服务在后台继续上传。
不确定您正在构建什么应用程序,但从隐私和安全的角度来看,通常将附件上传到第三方服务器的应用程序听起来是一个糟糕的主意。
| 归档时间: |
|
| 查看次数: |
1918 次 |
| 最近记录: |