2011-11-23 6 views
5

私はこの問題について昨晩質問を投稿しましたが、適切なヘルプを得るのに十分に説明したとは思いません。つまり、基本的には、ギャラリーから画像を選択して、アプリケーションに表示したImageViewに表示するボタンを押すアプリケーションがあります。これはすべて素晴らしいです。しかし、もう一度ボタンを押して別の画像を選択すると、アプリの強制終了となります。私はギャラリーに私のダウンロード写真フォルダから写真を撮る場合このプロセスでは外部割り当てが大きすぎます

UPDATE今、それが正常に動作し、できるだけ頻繁に私が好きなように写真を切り替えることができます。しかし、カメラの写真フォルダに戻って画像を変更すると強制的に閉じます。

UPDATE 2また、ギャラリーアプリにある他のフォルダでも正常に動作します。この問題(強制終了)が発生しているカメラのみが「カメラ」フォルダにあります。

UPDATE 3 19660800バイトの外部割り当てがこのプロセスには大きすぎます。問題を引き起こしています。選択されている写真のサイズを縮小する方法はありますか?ここ

 private static final int SELECT_PICTURE = 1; 

     private String selectedImagePath; 
     private ImageView img; 

     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 

      img = (ImageView)findViewById(R.id.myimageview); 

      ((Button) findViewById(R.id.taptoadd)) 
        .setOnClickListener(new OnClickListener() { 
         public void onClick(View arg0) { 
          Intent intent = new Intent(); 
          intent.setType("image/*"); 
          intent.setAction(Intent.ACTION_GET_CONTENT); 
          startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE); 
         } 
        }); 
     } 

     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      if (resultCode == RESULT_OK) { 
       if (requestCode == SELECT_PICTURE) { 
        Uri selectedImageUri = data.getData(); 
        selectedImagePath = getPath(selectedImageUri); 
        System.out.println("Image Path : " + selectedImagePath); 
        img.setImageURI(selectedImageUri); 
       } 
     } 
     } 

     public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = managedQuery(uri, projection, null, null, null); 
      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
      cursor.moveToFirst(); 
      return cursor.getString(column_index); 


     } 

はログ

   11-23 16:33:15.871: D/dalvikvm(9171): GC_EXTERNAL_ALLOC freed 51K, 49% free 2793K/5447K, external 20868K/22916K, paused 50ms 
    11-23 16:33:15.878: E/dalvikvm-heap(9171): 19660800-byte external allocation too large for this process. 
    11-23 16:33:15.886: E/GraphicsJNI(9171): VM won't let us allocate 19660800 bytes 
    11-23 16:33:15.906: D/dalvikvm(9171): GC_FOR_MALLOC freed <1K, 49% free 2792K/5447K, external 1668K/20868K, paused 18ms 
    11-23 16:33:15.906: D/skia(9171): --- decoder->decode returned false 
    11-23 16:33:15.906: D/AndroidRuntime(9171): Shutting down VM 
    11-23 16:33:15.910: W/dalvikvm(9171): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
    11-23 16:33:15.937: E/AndroidRuntime(9171): FATAL EXCEPTION: main 
    11-23 16:33:15.937: E/AndroidRuntime(9171): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.widget.ImageView.resolveUri(ImageView.java:521) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.widget.ImageView.setImageURI(ImageView.java:305) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at snapshot.app.LinearLayoutsActivity.onActivityResult(LinearLayoutsActivity.java:48) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2528) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.os.Looper.loop(Looper.java:130) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at java.lang.reflect.Method.invokeNative(Native Method) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at java.lang.reflect.Method.invoke(Method.java:507) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    11-23 16:33:15.937: E/AndroidRuntime(9171):  at dalvik.system.NativeStart.main(Native Method) 
+1

アプリの強制終了時にLogcat出力を投稿できますか? – slayton

+0

私はログを追加しました。 "カメラ"フォルダから写真を切り替えると、アプリケーションだけが強制終了され、他のすべてのフォルダは正常に動作します。 – dabious

+0

カメラフォルダ内の写真が大きすぎてOOMエラーが発生するようです。 Androidはアプリのために16MBのヒープしか持っていません。 – blessenm

答えて

5

であるあなたが取得しているエラーは、ロードされたビットマップが大きすぎることを意味しています。あなたはそれをダウンサンプリングする必要があります。これに対処する方法についていくつかの素晴らしい例については、この質問を参照してください:Strange out of memory issue while loading an image to a Bitmap object

更新:代わりにURIがビットマップとしてロードするImageViewのを伝えるのは、まず自分でビットマップをロードする必要があり、次にように、そのビットマップを設定しますImageView上のイメージこれはかなり簡単です。

は、あなたが持つビットマップを読み込むことができます最初の画像へのパスを含む文字列(私はよく分からないが、あなたは URI.getPath()を使用することができると思います)にURIを変換する必要がありますからビットマップをロードするには
Bitmap b = BitmapFactory.decodeFile(pathToImage); 

ビットマップ全体をデコードする代わりに、ビットマップを目的の解像度にダウンサンプリングします。画像ビューは125x125ピクセル、画像は1000x1000ピクセルと言います。 125/1000 = 8だから、すべての8番目のピクセルをデコードする必要があります。

int inSample = 8; 

opts = new BitmapFactory.Options(); 
opts.inSampleSize = inSample; 

Bitmap b = BitmapFactory.decodeFile(pathToImage, opts); // this bitmap will be 1/8 the size of the original 

そのかなりまっすぐ進むと、あなたのメモリの問題を解決する必要があります:私たちは次の手順を実行これを行うにしてください。この質問に対する私の答えの2番目の部分:Android GalleryView Recyclingを参照してください。

+0

私の人生の間、私はそれを働かせることはできません。 :/(入場 - 私はすべてこれに全く新しいです。) – dabious

+0

@dabious私の更新を見てください – slayton

+0

恐ろしい!ありがとうございました。 – dabious

関連する問題