android - send_sms - Excepción de seguridad al intentar acceder a una imagen de Picasa en un dispositivo que ejecuta 4.2
normal permissions in android (2)
en mi aplicación, permito que el usuario seleccione una imagen de la galería y no tuve problemas para hacer esto antes de la versión 4.2, pero ahora, cuando selecciono una imagen que está sincronizada desde mi cuenta de google +, creo que es una imagen de Picasa, aparece este error
11-25 20:31:52.508: E/AndroidRuntime(17387): java.lang.RuntimeException: An error occured while executing doInBackground()
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-25 20:31:52.508: E/AndroidRuntime(17387): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
11-25 20:31:52.508: E/AndroidRuntime(17387): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
11-25 20:31:52.508: E/AndroidRuntime(17387): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-25 20:31:52.508: E/AndroidRuntime(17387): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
11-25 20:31:52.508: E/AndroidRuntime(17387): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
11-25 20:31:52.508: E/AndroidRuntime(17387): at java.lang.Thread.run(Thread.java:856)
11-25 20:31:52.508: E/AndroidRuntime(17387): Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.gallery3d.provider.GalleryProvider from ProcessRecord{42817d60 17387:com.tyczj.bowling/u0a10087} (pid=17387, uid=10087) requires com.google.android.gallery3d.permission.GALLERY_PROVIDER or com.google.android.gallery3d.permission.GALLERY_PROVIDER
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.os.Parcel.readException(Parcel.java:1425)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.os.Parcel.readException(Parcel.java:1379)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2530)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.app.ActivityThread.acquireProvider(ActivityThread.java:4460)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2002)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1101)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:708)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:614)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.content.ContentResolver.openInputStream(ContentResolver.java:449)
11-25 20:31:52.508: E/AndroidRuntime(17387): at com.tyczj.bowling.BowlersListFragment$LoadImage.doInBackground(BowlersListFragment.java:390)
11-25 20:31:52.508: E/AndroidRuntime(17387): at com.tyczj.bowling.BowlersListFragment$LoadImage.doInBackground(BowlersListFragment.java:1)
11-25 20:31:52.508: E/AndroidRuntime(17387): at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-25 20:31:52.508: E/AndroidRuntime(17387): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
11-25 20:31:52.508: E/AndroidRuntime(17387): ... 4 more
Así que puse en com.google.android.gallery3d.permission.GALLERY_PROVIDER
en mi manifiesto, pero todavía recibo ese error, ¿qué más tengo que hacer? Esta es la primera vez que veo esto y no he encontrado información en línea sobre este problema.
Si esto va a ser un problema, ¿puedo hacer que la galería muestre las imágenes que están en el dispositivo y exclude Picasa
imágenes de exclude Picasa
?
¿Como dije que no tuve este problema antes de 4.2
o tal vez tiene que ver con una recent google+ update?
EDITAR:
Solo me da el error después de salir de la aplicación e intentar iniciarla de nuevo. Así que si estoy en la aplicación y selecciono la imagen para mostrar la primera vez que funciona bien hasta que salga. Almaceno el Uri
en mi base de datos para cargar cuando se inicia
Aquí están mis permisos de manifiesto
<uses-permission android:name="com.tyczj.bowling.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="com.google.android.gallery3d.permission.GALLERY_PROVIDER" />
<uses-permission android:name="android.permission.INTERNET" />
Lo que terminé haciendo para resolver esto es guardar la imagen localmente y usar el uri de esa imagen en cualquier momento que necesite la imagen
@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
if(resultCode == Activity.RESULT_OK && requestCode == 1){
Uri selectedImage = imageReturnedIntent.getData();
new SaveImage().execute(selectedImage.toString());
}
}
public class SaveImage extends AsyncTask<String,Void,Void>{
@Override
protected Void doInBackground(String... params) {
String uri = params[0];
if(uri != null && !uri.equals("")){
ContextWrapper cw = new ContextWrapper(getActivity());
File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
File mypath=new File(directory,String.valueOf(bowlerID)+"profile.jpg");
FileOutputStream fos = null;
InputStream input = null;
try {
fos = new FileOutputStream(mypath);
input = getActivity().getContentResolver().openInputStream(Uri.parse(uri));
Bitmap bitmap = BitmapFactory.decodeStream(input);
if(bitmap != null){
if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)){
ContentValues values = new ContentValues();
values.put(BowlersDB.PHOTO_URI, mypath.getAbsolutePath());
getActivity().getContentResolver().update(BowlersDB.CONTENT_URI, values,BowlersDB.ID+"="+bowlerID,null);
}
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
Tuve un problema similar al implementar ACTION_SEND y ACTION_SEND_MULTIPLE en mi aplicación (también en Android 4.2.x). Si fui a la galería, seleccioné una o más imágenes de Picasa , luego elegí "compartir", luego elegí mi aplicación del selector, mi aplicación arrojaría la misma excepción de Seguridad que la anterior. Cualquier intento de usar un método de consulta / carga de ContentResolver lanzaría.
También intenté agregar el permiso GALLERY_PROVIDER, pero no sirvió de nada (también, busqué en el manifiesto de Instagram; no tiene este permiso en la lista).
Finalmente, por un capricho, saqué android: launchMode = "singleTask" de mi entidad, y bajo y bajo, todo funcionó.
No tengo idea de por qué una aplicación de una sola tarea no podría compartir de esta manera. ¿Insecto? ¿Característica?