首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试访问运行4.2的设备上的Picasa镜像时出现安全异常

尝试访问运行4.2的设备上的Picasa镜像时出现安全异常
EN

Stack Overflow用户
提问于 2012-11-26 11:09:21
回答 2查看 3.5K关注 0票数 16

在我的应用程序中,我允许用户从图库中选择一个图像,在4.2版本之前,这样做没有问题,但是现在当我选择一个从我的google+帐户同步的图像时,我猜是一个Picasa图像,我得到这个错误

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

所以我在我的清单中加入了com.google.android.gallery3d.permission.GALLERY_PROVIDER,但是我仍然得到这个错误,那么我还需要做什么呢?这是我第一次看到这个问题,并且没有在网上找到关于这个问题的任何信息。

如果这将是一个问题,我可以只让画廊显示设备上的图像和exclude Picasa图像吗?

就像我说的,我在4.2之前没有这个问题,或者它可能与recent google+ update?有关

编辑:

只有当我退出应用程序并尝试重新启动它时,它才会给出错误。因此,如果我在应用程序中,并选择第一次显示的图像,它可以正常工作,直到我退出。我将Uri存储在数据库中,以便在启动时加载

以下是我的清单权限

<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" />
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-28 21:52:54

我最终解决这个问题的方法是将图像保存在本地,并在需要图像时随时使用该图像的uri。

@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;
        }

    }
票数 0
EN

Stack Overflow用户

发布于 2013-02-12 04:13:08

我在我的应用程序(也是在Android4.2.x中)实现ACTION_SEND和ACTION_SEND_MULTIPLE时遇到了类似的问题。如果我去画廊,选择一个或多个Picasa图像,然后选择“共享”,然后从选择器中选择我的应用程序,我的应用程序将抛出与上面相同的SecurityException。任何从ContentResolver使用查询/加载方法的尝试都会抛出。

我也尝试添加GALLERY_PROVIDER权限,但没有帮助(我也查看了Instagram的清单;它没有列出这个权限)。

最后,我心血来潮地从我的实体中取出了android:launchMode="singleTask“,结果一切都正常了。

我不知道为什么单任务应用程序会被禁止以这种方式分享。虫子?功能?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13558177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档