2017-05-15 19 views
0

Edit2:アンドロイド:largeHeap = "true"をマニフェストに追加しましたが、今はうまくいくようです。しかし、私はそれが正しいアプローチであるかどうかわからないので、私は今それを閉じないだろうと私はより多くのテストを行うでしょう。Java/Android - ビットマップ作成 - OOMエラー

私は内蔵カメラ(カメラ1、アプリケーションはAndroid 4.4.2で動作する必要があります)を備えたアプリケーションで作業していますが、アプリケーションは風景モードで写真を撮ることができます。ポートレートモードの風景写真。

私は基本的にポートレートモードの写真を撮影して回転させて切り取ります(上下を切り取って4:3の比率にしています)。

このコードはAndroid 6.0.1(Samsung Galaxy Tab S2)(現在はテスト済みですが既に30個)で動作しますが、4.4.2(Motorola Symbol TC70)でOOMエラーが発生します。私は3番目の写真を撮影した後にエラーが発生します。

java.lang.OutOfMemoryError 
    at android.graphics.Bitmap.nativeCreate(Native Method) 
    at android.graphics.Bitmap.createBitmap(Bitmap.java:809) 
    at android.graphics.Bitmap.createBitmap(Bitmap.java:786) 
    at android.graphics.Bitmap.createBitmap(Bitmap.java:718) 
    at de.sdnord.ballistiks.topspeedgt.main.detail_fragment.fotos.CameraActivity$1.onPictureTaken(CameraActivity.java:66) 
    at android.hardware.Camera$EventHandler.handleMessage(Camera.java:940) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5050) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:780) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:596) 
    at dalvik.system.NativeStart.main(Native Method) 

私はこのコードを追加:

if (PreferenceManager.getDefaultSharedPreferences(CameraActivity.this).getString(Constants.FOTO_ORIENTATION, Constants.FOTO_ORIENTATION_LANDSCAPE).equals(Constants.FOTO_ORIENTATION_PORTRAIT)) { 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(90); 

      Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
      bitmap = Bitmap.createBitmap(bitmap, bitmap.getWidth()/2 - bitmap.getHeight()*heightMultiplier/widthMultiplier/2, 0, bitmap.getHeight()*heightMultiplier/widthMultiplier, bitmap.getHeight(), matrix, false); 
      ByteArrayOutputStream streamsy = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, streamsy); 
      data = streamsy.toByteArray(); 
      bitmap.recycle(); 
      try { 
       streamsy.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

これはライン66である:

bitmap = Bitmap.createBitmap(bitmap, bitmap.getWidth()/2 - bitmap.getHeight()*heightMultiplier/widthMultiplier/2, 0, bitmap.getHeight()*heightMultiplier/widthMultiplier, bitmap.getHeight(), matrix, false); 

私は一種の無知だと誰かが役立つことを願って、アイデアやヒントを持っています。

素晴らしい

編集:私は画面の中央のみをしたいので、私は、それをトリミングしてい 。 Camera Screenshot

Edit2:アンドロイド:largeHeap = "true"をマニフェストに追加しましたが、今はうまくいくようです。しかし、私はそれが正しいアプローチであるかどうかわからないので、私は今それを閉じないだろうと私はより多くのテストを行うでしょう。

+0

'回転して切り抜くと回転して**縮尺を変えてください。 –

+0

それを縮小することは私を助けません、私はより良い理解のためのスクリーンショットを添付します – Awe

答えて

0

アンドロイド:largeHeap = "true"をマニフェストに追加しても問題なく動作します。

Awe

関連する問題