1

おそらく他の多くの質問と同様の質問を投稿して申し訳ありませんが、これに対する解決策が見つからないか、このエラーが発生する状況に似た状況を見つけることができません。私はこれに対する答えを見つけようと一週間ずっとグーグルでグーグルで検索しましたが、まだ運がありません。私はアンドロイドにかなり慣れていないので、それが明らかな場合は、おそらくこれが理由です!

エラーの原因となる手順は次のとおりです。

アプリはカメラを使用して写真を撮ります
この画像はSDカードのフォルダーに保存されます
このファイルのコピーが作成され、画像ごとに50〜100kbに​​圧縮されます(これは私が表示しようとしているものです)
次に保存します
アクティビティ (onResume 私はこれを行います) がロードされたときのsqlite データベース内の画像の初期サイズとファイル名 データベースにファイル名がある場合、ファイル名を取得して画像を表示します - これがエラーの場所です.

if(c.getCount() > 0) {

   String[] cols = new String[] {DBAdapter.FILENAME,DBAdapter.DATETIME};

    int[] values = new int[] {R.id.thumbnail,R.id.datetime_stamp};

    SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.image_listview, c, cols, values, 0);

    ListView listView = (ListView) findViewById(android.R.id.list);
    listView.setAdapter(cursorAdapter);
    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> listView, View view, int position, long id) {
            String row = c.getString(c.getColumnIndexOrThrow(DBAdapter.KEY_ID)); // row ID from transactions
            Toast.makeText(getBaseContext(), row, Toast.LENGTH_SHORT).show();
        }
    });
}

私は明らかに何かが欠けていますが、それは私を夢中にさせているだけです!

これが役立つ場合に発生するエラーは次のとおりです。

06-13 22:17:25.269: E/AndroidRuntime(24153): FATAL EXCEPTION: main
06-13 22:17:25.269: E/AndroidRuntime(24153): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:511)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:325)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:350)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.graphics.drawable.Drawable.createFromPath(Drawable.java:831)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.ImageView.resolveUri(ImageView.java:573)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.ImageView.setImageURI(ImageView.java:350)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.support.v4.widget.SimpleCursorAdapter.setViewImage(SimpleCursorAdapter.java:197)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.support.v4.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:143)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.AbsListView.obtainView(AbsListView.java:1451)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.ListView.makeAndAddView(ListView.java:1786)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.ListView.fillDown(ListView.java:705)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.ListView.fillGap(ListView.java:676)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3579)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.AbsListView.onTouchEvent(AbsListView.java:2294)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.widget.ListView.onTouchEvent(ListView.java:3493)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.View.dispatchTouchEvent(View.java:3935)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:934)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:973)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:973)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:973)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:973)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:973)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1741)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1172)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.app.Activity.dispatchTouchEvent(Activity.java:2135)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1725)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2241)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1925)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.os.Handler.dispatchMessage(Handler.java:130)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.os.Looper.loop(SourceFile:351)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at android.app.ActivityThread.main(ActivityThread.java:3814)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at java.lang.reflect.Method.invokeNative(Native Method)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at java.lang.reflect.Method.invoke(Method.java:538)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:659)
06-13 22:17:25.269: E/AndroidRuntime(24153):    at dalvik.system.NativeStart.main(Native Method)

助けてくれてありがとう。

4

1 に答える 1

0

まず、データベースに画像を保存しないでください。それをsdに保存し、DB(ファイルパス)に参照を入れます。データベースは大きなバイナリ データ用に作成されていません (大幅に遅くなる可能性があります)。

第二に、あなたが提供した引用スニペットにバグがあるとは思いません。カメラから写真を撮る場合、少なくとも 5MP であると仮定します。5MP の写真 @24bit には少なくとも 114 MB の RAM が必要になるため、写真全体をビットマップとしてロードしないように注意する必要がありますが、約 24 しかありません。やりたいことは、縮小版を UI にロードすることです。最初に次元を取得します:

// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);

次に、それをどれだけ縮小する必要があるかを確認し (2 のべき乗にする必要があります)、正しいサンプリング オプションでデコードします。

 // Calculate inSampleSize
options.inSampleSize = 8;

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);

詳細については、http://developer.android.com/training/displaying-bitmaps/load-bitmap.html をご覧ください

于 2013-06-13T22:11:48.483 に答える