gpt4 book ai didi

android - 在获取电子邮件附件名称时获取权限错误 java.lang.SecurityException : Permission Denial on 3. x Android 设备

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:12 31 4
gpt4 key购买 nike

当我将其启动模式设置为“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");
}
}

安卓 list

<?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 native 应用程序,打开任何附件(office文档)进行查看。3) 选择 LaunchMode app 以完成操作。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/qoconnect@gmail.com/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 应用程序的一些更新。 link here:

最佳答案

当您收到 Intent 并且没有使用您请求的权限(READ_GMAILWRITE_GMAIL)时,您可能获得了读取文件名的 URI 权限。 URI 权限仅在您的应用程序 finish()es 之前有效,因此当您尝试恢复时您不会拥有它。

这与您的经验一致 - 当 Intent 是新鲜的而不是旧的时,它会起作用。我认为 WRITE_GMAIL 是签名权限,我猜 READ_GMAIL 也是。在那种情况下,您无能为力。 READ_ATTACHMENT 可能是您请求的更合适的权限。

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

尝试从您的 list 中删除 uses-permission 标签,看看您是否有相同的体验。您还可以在收到 intent 时通过检查其标志来尝试检查它。

checkCallingOrSelfUriPermission(documentUri , Intent.FLAG_GRANT_READ_URI_PERMISSION)

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

关于android - 在获取电子邮件附件名称时获取权限错误 java.lang.SecurityException : Permission Denial on 3. x Android 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9441866/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com