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

2 に答える 2

2

私のアプリ(Android 4.2.xでも)にACTION_SENDとACTION_SEND_MULTIPLEを実装するときに同様の問題が発生しました。ギャラリーに移動し、1つ以上のPicasa画像を選択し、[共有]を選択してから、ピッカーからアプリを選択すると、アプリは上記と同じSecurityExceptionをスローします。ContentResolverからquery/loadメソッドを使用しようとすると、スローされます。

GALLERY_PROVIDER権限も追加しようとしましたが、役に立ちませんでした(また、Instagramのマニフェストを調べました。この権限はリストされていません)。

最終的に、気まぐれに、私は自分のエンティティからandroid:launchMode = "singleTask"を取り出しましたが、見よ、すべてが機能しました。

シングルタスクアプリがこのように共有できない理由がわかりません。バグ?特徴?

于 2013-02-11T20:13:08.357 に答える
0

これを解決するために私がやったことは、画像をローカルに保存し、画像が必要なときにいつでもその画像の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;
        }

    }
于 2014-04-28T13:52:53.797 に答える