1

私のアプリでは、SDカードに画像を表示するオプションがあり、ユーザーは1つの画像を選択でき、次のアクティビティの画像ビューに読み込まれます。

Samsung Ace や Samsung Galaxy S3 などの 2 つのデバイスでアプリをテストしました。

2.3バージョンのSamsung Aceでは、画像を選択でき、onActivityの結果から次のアクティビティが呼び出され、画像がImageviewにロードされます。ここでは、これをn回実行できます(使用する他のオプションはカメラを介してキャプチャし、次のアクティビティでロードします。ここでもプロセスは良好です)

バージョン4.2のSamsung Galaxy S3で同じプロセスを初めて試したとき、カメラを介して選択またはキャプチャして、イメージビューにロードすることができました。2回目にしようとすると、アプリがクラッシュして、

E/dalvikvm-heap( 7058): Out of memory on a 31961104-byte allocation.
E/AndroidRuntime( 7058): FATAL EXCEPTION: main
E/AndroidRuntime( 7058): java.lang.OutOfMemoryError
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:389)
E/AndroidRuntime( 7058): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:418)
E/AndroidRuntime( 7058): at com.tribal.pages.app.UploadPhoto$ShowCapturedImage.onPostExecute(UploadPhoto.java:442)
E/AndroidRuntime( 7058): at com.tribal.pages.app.UploadPhoto$ShowCapturedImage.onPostExecute(UploadPhoto.java:1)
E/AndroidRuntime( 7058): at android.os.AsyncTask.finish(AsyncTask.java:602)
E/AndroidRuntime( 7058): at android.os.AsyncTask.access$600(AsyncTask.java:156)
E/AndroidRuntime( 7058): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
E/AndroidRuntime( 7058): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 7058): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 7058): at android.app.ActivityThread.main(ActivityThread.java:4517)
E/AndroidRuntime( 7058): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 7058): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 7058): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
E/AndroidRuntime( 7058): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
E/AndroidRuntime( 7058): at dalvik.system.NativeStart.main(Native Method)
E/android.os.Debug( 2098): !@Dumpstate > dumpstate -k -t -n -z -d -o /data/log/dumpstate_app_error
E/widget  ( 2468): [MSC_HERO_Accu]>>> SM:399 [0:0] IR : false, IPR : false
E/Launcher( 2468): Error finding setting, default accessibility to not found: accessibility_enabled
E/widget  ( 2468): [MSC_HERO_Accu]>>> SM:399 [0:0] IR : false, IPR : false

キャプチャした画像または選択した画像をImageViewにロードするために、次の2つの方法を使用してみました方法1

Bitmap  bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(Appconstants._uri));
                       bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
ImageView uplaod_image.setImageBitmap(bitmap);

方法 2

Bitmap bitmap = BitmapFactory.decodeFile(Appconstants.f);
ImageView uplaod_image.setImageBitmap(bitmap);

しかし、上記のエラーを言ってアプリがクラッシュするたびに、これを解決する方法....

4

2 に答える 2

2

動作に見られる違いは、おそらく 2 つの電話の画像のサイズの違いによるものです。

電話したくなるかもしれませんが、

upload_image.setImageDrawable(null);

別のイメージをロードしようとする前に、imageView をクリアする (または、ここで説明する方法のいずれかを使用する) ことで、その後の割り当ての前にガベージ コレクターによってメモリがクリーンアップおよび収集され、Out of memoryエラーが防止されます。

于 2012-10-19T09:59:42.180 に答える
1

デバイスの画面サイズに応じて、メモリにロードする前に画像をスケーリングしてみてください。

BitmapFactory オプションinJustDecodeBounds = trueを使用して、ビットマップをメモリにデコードする前にビットマップのサイズを取得できます。

高さと幅を取得し、

int imageHeight = options.outHeight;
int imageWidth = options.outWidth;

次に、要件に応じて、画像の必要な高さと幅でスケーリングできます。

int inSampleSize = Math.min(imageWidth /reqWidth,imageHeight /reqHeight);

最後に を適用しinSampleSizeてビットマップをスケーリングします。詳細については、こちらの回答を確認してください。

于 2012-10-19T10:01:52.910 に答える