在我们的应用程序中,我们需要从电子邮件客户端读取附件并将其上传到服务器。 对于默认的 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
甚至尝试过授予 Gmail 读写权限,但没有成功。
观察是
It is working fine for Nexus but for samsung devices 4.2 and 4.1,working fine initially if activity is created for first time,but if activity is in background throwing above said exceptions.
尝试使用以下代码获取附件文件名。
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();
我的 list 文件
<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>
用户权限
<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" />
请告诉我们如何让它工作,我需要 Activity 启动模式为 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"/>
根据 Android 文档,“如果未为 intent 过滤器指定方案,则将忽略所有其他 URI 属性。”删除方案和 URI 属性后,过滤 Intent 的唯一其他方法是使用 Mime 类型,我们都知道自定义文件扩展名没有注册的 MIME 类型。
作为引用,URI 的形式为:
scheme://host:port/path
pathPrefix
pathPattern
因此,如果没有方案,所有这些都会下降。发现上述内容后,我尝试了显而易见的方案——使用“*”作为方案,甚至尝试了“.*”。这些都没有用。我希望其他人可以建立我的试验。但我相信这与选择正确的方案有关。不幸的是,我所知道的唯一方案是 http https 内容和文件,以上都不是 Elixir 。
<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>
此 Intent 将导致 gmail 显示下载/预览按钮。事实上,当 .ext 文件也作为附件发送到常规电子邮件客户端时,这也会导致您的应用程序打开。
来源:
Android get attached filename from gmail app Intent filter to download attachment from gmail apps on Android
关于android - 在我的应用程序 android 中从 gmail 应用程序读取附件的安全异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22679348/