2012-10-19 2 views
1

내 메모리에 오류가 있습니다. sd 카드에 이미지를 표시하는 옵션이 있습니다.이 이미지는 사용자가 하나의 이미지를 선택할 수 있고 내 다음 활동의 이미지보기.안드로이드 이미지를 sd 카드에서 이미지 뷰에 저장합니다. 삼성 SIII

나는 Samsung Ace 및 Samsung Galaxy S3와 같은 내 장치에서이 앱을 테스트했습니다.

Samsung Ace of 2.3 버전에서 이미지를 선택할 수 있으며 onActivity 결과에서 다음 액티비티가 호출되고 이미지가 이미지 뷰에로드됩니다. 여기서 n 번 반복 할 수 있습니다 (기타 옵션을 사용하면 카메라를 통해 캡처하고 다음 활동에로드합니다. 여기에도 프로세스가 좋음)

삼성 Galaxy S3에서 버전 4.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): [email protected] > 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 

I 이미지 뷰 방법에 캡처 된 이미지 또는 선택한 이미지를로드하기 위해 다음과 같은 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); 

그러나 매번 위의 오류를 말하는 응용 프로그램 충돌, 어떻게이 문제를 해결하려면 ....

+0

이미지의 크기는 얼마나됩니까? – xfx

+0

크기를 의미합니다. 캡처 된 이미지는 약 1.2MB ~ 1.7MB입니다. ..... –

답변

2

동작에서 나타나는 차이는 두 전화기의 이미지 크기 차이 때문일 수 있습니다.

당신은 전화를 할 수 있습니다,

upload_image.setImageDrawable(null); 

가 이미지 뷰를 삭제 (또는 방법 중 하나가 here 상세한 사용) 그 메모리에 의해 정리 및 수집되도록 다른 이미지를로드하기 전에, 할 후속 할당 전에 가비지 수집기를 사용하고 Out of memory 오류를 방지하십시오.

1

봅니다

당신은 메모리에 디코딩 전에 비트 맵의 ​​크기를 얻을 수 BitmapFactory 옵션 inJustDecodeBounds = true를 사용할 수 있으며, 화면 크기 해당 장치는 데에 따라 메모리에로드하기 전에 이미지 크기를 조정합니다.
int imageHeight = options.outHeight; 
int imageWidth = options.outWidth; 

그런 다음 당신이 필요한 높이와 귀하의 요구 사항에 따라 이미지의 폭을 확장 할 수 있습니다

GET 높이와 폭,

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

그리고 마지막으로 확장 할 수있는 inSampleSize을 적용 비트 맵. 자세한 내용은 내 대답 here을 확인하십시오.

관련 문제