Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Obtener permiso error java.lang.SecurityException: Permiso de denegación en 3.x dispositivos Android al obtener el nombre del archivo adjunto de correo electrónico

Estoy enfrentando problema en la apertura de correo electrónico en MYApp cuando hice su modo de lanzamiento a "singleInstance".

He adjuntado muestra de proyecto Android que lee nombre de archivo de adjunto de correo electrónico y lo muestra en la pantalla. Funciona bien en caso de onCreate pero lanza error en onNewIntent cuando el modo de inicio de aplicaciones es singleInstance.

Launchmode.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"); } } 

}

AndroidManifest

 <?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> 

Pasos para reproducir 1) Instale apk en el dispositivo. 2) Vaya a la aplicación nativa de gmail en el dispositivo, abra cualquier archivo adjunto (documento de oficina) para verlo. 3) Elija la aplicación LaunchMode para completar la acción. 4) La aplicación LaunchMode mostrará el nombre del archivo en la pantalla.

Esto funciona bien por primera vez (flujo onCreate), pero cuando esta aplicación es cambiar en segundo plano y de nuevo intento 2,3,4 pasos .. falla la aplicación con el error

 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 

Necesito arreglar esto como, necesito tener la sola instancia de la aplicación y debo conseguir el nombre del accesorio del email también. Por favor, hágamelo saber Si me falta algo aquí.

Mi pregunta aquí es por qué funciona en flujo de onCreate y no funcionará en caso de onNewIntent

Nota: 1) Funciona muy bien con los teléfonos 2.x 2) Funciona bien con el modo de inicio único superior. 3) Algunas actualizaciones en la aplicación de Gmail. Enlace aquí:

  • Android singletop singleinstance y singletask
  • startActivityForResult no funciona correctamente con launchMode singleInstance
  • OnActivityResult no se dispara si el modo de inicio de la actividad es singleInstance
  • Cómo habilitar sólo una instancia de mi aplicación
  • 2 Solutions collect form web for “Obtener permiso error java.lang.SecurityException: Permiso de denegación en 3.x dispositivos Android al obtener el nombre del archivo adjunto de correo electrónico”

    Es probable que tenga un permiso URI para leer el nombre del archivo cuando recibió la intención y no está utilizando los permisos que solicitó ( READ_GMAIL y WRITE_GMAIL ). El permiso de URI es válido sólo hasta que su aplicación finish() es, por lo que no lo tendrá cuando intente reanudar.

    Eso es consistente con sus experiencias – funciona cuando la intención es fresca, pero no las viejas. Creo que WRITE_GMAIL es un permiso de firma y estoy adivinando que READ_GMAIL es así. En ese caso, no hay mucho que puedas hacer. READ_ATTACHMENT podría ser un permiso más apropiado para que usted lo solicite.

    Más información sobre los permisos URI: http://developer.android.com/guide/topics/security/permissions.html#uri

    Intente eliminar las etiquetas de uses-permission de su manifiesto y ver si tiene la misma experiencia. También puede intentar examinar la intent cuando la recibe revisando sus banderas.

     checkCallingOrSelfUriPermission(documentUri , Intent.FLAG_GRANT_READ_URI_PERMISSION) 

    Si obtiene 0 devuelto, ha estado utilizando permisos de URI.

    Al igual que skoke dijo, ya no puede leer de GMail si la intención que dio su permiso no es fresco, es decir, debe ser la intención de la actividad original. Si su intención es de onNewIntent entonces probablemente no tendrá éxito.

    Mi solución no es hermosa, pero parece estar funcionando. En mi onResume llamé a una función personalizada para ver si podía acceder al contenido de Gmail. Si no, mostré al usuario un mensaje y les pedí que cerraran la aplicación e intentaran de nuevo. Hey, al menos no se bloquea.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.