私はこの問題について昨晩質問を投稿しましたが、適切なヘルプを得るのに十分に説明したとは思いません。つまり、基本的には、ギャラリーから画像を選択して、アプリケーションに表示した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)
アプリの強制終了時にLogcat出力を投稿できますか? – slayton
私はログを追加しました。 "カメラ"フォルダから写真を切り替えると、アプリケーションだけが強制終了され、他のすべてのフォルダは正常に動作します。 – dabious
カメラフォルダ内の写真が大きすぎてOOMエラーが発生するようです。 Androidはアプリのために16MBのヒープしか持っていません。 – blessenm