获取权限错误 java.lang.SecurityException:在 3.x Android 设备上获取电子邮件附件名称时出现权限拒绝

2023-11-26

当我将其启动模式设置为“singleInstance”时,我在 MYApp 中打开电子邮件时遇到问题。

我附上了示例 Android 项目,它从电子邮件附件中读取文件名并将其显示在屏幕上。 在 onCreate 中工作正常,但在应用程序启动模式为 singleInstance 时在 onNewIntent 中抛出错误。

启动模式.java

package your.namespace.launchmode;


public class LaunchModeActivity extends Activity {
    private static final int OPEN_ACT = 2;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String name = getAttachmetName(getIntent());
    if(null != name)
    {
        TextView textv = (TextView) findViewById(R.id.attachmentnm);
        textv.setText(name);
    }
}

@Override
protected void onNewIntent(Intent savedInstanceState)
{
    super.onNewIntent(savedInstanceState);
    String name = getAttachmetName(savedInstanceState);
    if(null != name)
    {
        TextView textv = (TextView) findViewById(R.id.attachmentnm);
        textv.setText(name);
    }
}


private String getAttachmetName(Intent intent) {
    final Uri documentUri = intent.getData();
    if(null != documentUri){
    final String uriString = documentUri.toString();
    String documentFilename = null;


    final int mailIndexPos = uriString.lastIndexOf("/attachments");
    if (mailIndexPos != -1) {
        final Uri curi = documentUri;
        final String [] projection = new String[] {OpenableColumns.DISPLAY_NAME};
        final Cursor cursor = getApplicationContext().getContentResolver().query(curi, projection, null, null, null);
        if (cursor != null) {
            final int attIdx = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
            if (attIdx != -1) {
                cursor.moveToFirst();
                documentFilename = cursor.getString(attIdx);                
            }
            cursor.close();
        }
    }
    return documentFilename;
    }
    return null;
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    if((resultCode == RESULT_OK) && (requestCode == OPEN_ACT))
    {
        Log.d("LaunchMode", "Second activity returned");
    }
}

}

Android清单

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.namespace.launchmode"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-permission android:name="com.google.android.gm.permission.READ_GMAIL"/>
    <uses-permission android:name="com.google.android.gm.permission.WRITE_GMAIL"/>
    <uses-permission android:name="com.google.android.providers.gmail.permission.READ_GMAIL"/>
    <uses-permission android:name="com.google.android.providers.gmail.permission.WRITE_GMAIL"/>
    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:launchMode="singleInstance"
            android:name=".LaunchModeActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter >
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <!-- docx -->
                <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
                <!-- xlsx -->
                <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
                <!-- pptx -->
                <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
                <data android:mimeType="application/vnd.ms-excel" />
                <data android:mimeType="application/msword" />
                <data android:mimeType="application/vnd.ms-powerpoint" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
    </application>
</manifest>

重现步骤 1)在设备上安装apk。 2)进入设备上的gmail本机应用程序,打开任何附件(office文档)进行查看。 3)选择LaunchMode应用程序来完成操作。 4)LaunchMode应用程序将在屏幕上显示文件名。

第一次(onCreate 流程)效果很好,但是当这个应用程序在后台切换时,我再次尝试 2,3,4 步骤..应用程序崩溃并出现错误

E/DatabaseUtils(30615): java.lang.SecurityException: Permission Denial: reading com.google.android.gm.provider.MailProvider uri content://gmail-ls/[email protected]/messages/5/attachments/0.2/BEST/false from pid=32657, uid=10058 requires com.google.android.gm.permission.READ_GMAIL
E/DatabaseUtils(30615):     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:309)
E/DatabaseUtils(30615):     at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:178)
E/DatabaseUtils(30615):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111)
E/DatabaseUtils(30615):     at android.os.Binder.execTransact(Binder.java:339)
E/DatabaseUtils(30615):     at dalvik.system.NativeStart.run(Native Method)
D/AndroidRuntime(32657): Shutting down VM

我需要解决这个问题,因为我需要有单个应用程序实例,并且也应该获取电子邮件附件名称。 如果我在这里遗漏了什么,请告诉我。

我的问题是为什么它在 onCreate 流程中工作,而在 onNewIntent 流程中不起作用

笔记: 1) 适用于 2.x 手机 2) 在单顶启动模式下工作良好。 3) Gmail 应用程序的一些更新。链接在这里:


当您收到意图并且未使用您请求的权限时,您可能获得了读取文件名的 URI 权限(READ_GMAIL and WRITE_GMAIL)。 URI 权限仅在您申请之前有效finish()es,因此当您尝试恢复时将不会有它。

这与你的经验是一致的——当意图是新鲜的而不是旧的意图时它会起作用。我觉得WRITE_GMAIL是签名许可,我猜READ_GMAIL也是如此。在这种情况下,您无能为力。READ_ATTACHMENT可能是您请求的更合适的权限。

有关 URI 权限的更多信息:http://developer.android.com/guide/topics/security/permissions.html#uri

尝试删除uses-permission从您的清单中标记,看看您是否有相同的经历。您还可以尝试检查intent当您通过检查其标志收到它时。

checkCallingOrSelfUriPermission(documentUri , Intent.FLAG_GRANT_READ_URI_PERMISSION)

如果返回 0,则说明您一直在使用 URI 权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取权限错误 java.lang.SecurityException:在 3.x Android 设备上获取电子邮件附件名称时出现权限拒绝 的相关文章

随机推荐

  • 如何在Android中使用TextWatcher类?

    谁能告诉我如何屏蔽子串 in EditText或如何改变EditText 密码类型的子字符串输入 or replace由另一个特点像这样 123xxxxxxxxx3455 String contents et1 getText toStri
  • 安全地将 JSON 字符串转换为对象

    给定一个 JSON 数据字符串 如何安全地将该字符串转换为 JavaScript 对象 显然 我可以通过以下方式不安全地做到这一点 var obj eval json 但这让我很容易受到包含其他代码的 JSON 字符串的影响 简单地评估这些
  • IDEA 的 CheckStyle 插件 - java 方式的警告呈现和自动修复?

    是否可以使其显示 java spellchecker 风格的警告列表 而不是带有行号的旧式错误列表 它可以自动修复 附近缺少空格等问题吗 也许我需要一个不同的插件 那么哪个呢 Try QAPlug 检查样式插件 然后进入 分析 分析代码 不
  • 业务验证逻辑代码异味

    考虑以下代码 partial class OurBusinessObject partial void OnOurPropertyChanged if ValidateOurProperty this OurProperty false t
  • C# 语音识别

    我现在正在制作一个智能家居控制系统 我有一个小问题 我正在考虑使用 Cosmos 作为基本系统 并向其中添加所需的命名空间库 但由于通常的 System Speech Recognition 命名空间过于依赖 Windows Speech
  • 使用 R 剪切功能 - 中断和标签选项如何工作

    我正在寻找 标签是使用 a b 间隔符号构建的 的清晰解释 如中所述cut help file 这似乎缺乏解释 所以我在一些简单的例子上测试了cut 如下 df lt data frame c 1 2 3 4 5 6 7 99 names
  • Haskell:将文件中的每一行插入列表中

    我目前正在使用 Haskell 进行项目 但发现自己遇到了一些麻烦 我应该读取 dictionary txt 文件中的每一行并将其插入到列表中 但我似乎无法这样做 我有这个代码 main do let list loadNums dicti
  • Volley onErrorResponse 给出 NullPointerException

    我在我的android应用程序中尝试volley库 这是我的日志 10 31 14 30 09 277 E AndroidRuntime 22916 java lang NullPointerException 10 31 14 30 09
  • 如何从 Qt 小部件中删除窗口边框(包含最小化、最大化和关闭按钮)?

    我想制作一个小部件 QPushButon 的动画以在我的应用程序屏幕上移动 为此 我创建了一个新按钮 并使用 QPropertyAnimation 类和按钮的属性 几何 将其从上到下移动 问题是按钮带有关闭 最小化 最大化按钮等 我不希望它
  • 在 Java Map 中查找重复值?

    我想将值显示在HashMap A HashMap可能有重复的值 但不是重复的键 但我只想显示一个值一次 所以我应该找出是否Map有重复值 我知道我们可以迭代Map并使用返回布尔值map containsValue value 我想知道是否存
  • 暂存数据库困境

    假设有3个数据库 生产 Staging Dev 据我所知 临时数据库需要与生产数据库同步 但 当我们发展的时候 我们可以为所欲为Dev数据库并更改架构 现在是先有鸡还是先有蛋的问题 要在分期中进行测试 Staging数据库模式需要根据开发数
  • 来自 CREATE USER 的语法错误,变量给出用户名和密码

    存储过程代码 CREATE DEFINER root localhost PROCEDURE P CreateUser3 IN Username NVARCHAR 30 IN Password NVARCHAR 32 IN DBName V
  • 底部表格内的 RecyclerView 不起作用

    以下是我的xml MainView
  • 在 Kendo 网格中手动维护分页上的脏单元格标记

    我有一个可编辑的 Kendo 网格 我可以在其中编辑单元格 并且网格将红色标记添加到单元格的左上角 我转到另一个页面 然后返回到进行编辑的页面 红色标记消失了 但单元格中新添加的值仍然存在 我在 Kendo 网站上看到了对此的回应 其中建议
  • 如何使用 CSS 降低元素背景的不透明度?

    是否可以仅使用 CSS 来制作background元素半透明但元素的内容 文本和图像 不透明 我想在不将文本和背景作为两个单独的元素的情况下完成此任务 尝试时 p position absolute background color gre
  • 在本地应用 web.config 转换

    我的 web config 有一个转换 如果我发布到 Azure 它当前可以工作 但当我构建 运行时它不能在本地工作 如何在本地进行 发布 以便将本地转换应用于我的开发盒上的 web config 目前 我右键单击 gt 发布到 Azure
  • 长时间运行的 Web 作业被 Azure 中止

    我的 Azure 网站中有一个 Web 作业正在中止 运行时间相当长 大概需要30分钟 它从 Azure SQL 数据库中提取大量数据 并基本上编译用于报告的数据 查看输出日志 Azure 似乎在执行过程中中止了作业 没有任何警告 没有任何
  • 使用 jfreechart 创建条形图,并将相同类别的条形图放在一起

    我想使用 jfreechart 制作条形图 以便属于同一类别的条形图应相邻显示 没有任何间隙 类别显示时应留有间隙 此外 每个类别可能有不同数量的条形 如何使用 Jfreechart 库实现它 下图是我所需要的示例 这里 同一类别的所有条形
  • 为什么 CoffeeScript 将类定义包装在闭包中?

    在 CoffeeScript 中 this class Foo method x gt x 1 编译为 Generated By CoffeeScript Foo function function Foo Foo prototype me
  • 获取权限错误 java.lang.SecurityException:在 3.x Android 设备上获取电子邮件附件名称时出现权限拒绝

    当我将其启动模式设置为 singleInstance 时 我在 MYApp 中打开电子邮件时遇到问题 我附上了示例 Android 项目 它从电子邮件附件中读取文件名并将其显示在屏幕上 在 onCreate 中工作正常 但在应用程序启动模式