android - 在我的应用程序 android 中从 gmail 应用程序读取附件的安全异常

标签 android

在我们的应用程序中,我们需要从电子邮件客户端读取附件并将​​其上传到服务器。 对于默认的 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/

相关文章:

javascript - Android 设备高度在钛手机上不准确

android - Gradle下载的自动链接源码

javascript - 如何使移动键盘外观撞到 div 而不是绝对定位在它上面?

java - 为主要和特定口味的 android 运行单元测试

android - 在 Android 日历 View 中首先显示年份选择

Android 数据绑定(bind) - 错误 :(119, 29) 标识符必须具有来自 XML 文件的用户定义类型。 main_radio_subscribe 丢失了

MacBook M1 Pro 上的 Android Studio 安装错误 : java. nio.file.AccessDeniedException

java - Android 字符串比较、子字符串

javascript - 如何 Intent 在Webview中打开Whatsapp?

java - 如何并排调整两个 TextView 的大小并使用屏幕宽度的 50%