3

Android の一部のデバイスおよびバージョンで、カメラで写真を撮るときに問題が発生します。たとえば、私の Xperia U v4.0.3 ではコードは正常に動作しますが、別の Xperia U v2.3.3 では動作しません...

このエラーについて多くのことを読みましたが、修正できませんでした...

写真を撮って表示する私のコード:

public void callCamera(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photo = new File(Environment.getExternalStorageDirectory(),  "Pic.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(photo));
imageUri = Uri.fromFile(photo);
startActivityForResult(intent, SELECT_CAMERA);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == SELECT_CAMERA) {


                Uri selectedImage = imageUri;
                getContentResolver().notifyChange(selectedImage, null);

                ContentResolver cr = getContentResolver();

                try {

                    imageSelected = android.provider.MediaStore.Images.Media
                     .getBitmap(cr, selectedImage);
                    // I tried to read the image created for the camera in the Sd
                    //But I've got the same error... 
                    //imageSelected = Utils.readImageSD(this, selectedImage.getPath());

                     imageSelected = Utils.rotateImage(Utils.scaleBitmap(imageSelected, 160, 160));
                     ivImageLoad.setImageBitmap(imageSelected);

                } catch (Exception e) {
                    Utils.showToast(getApplicationContext(), R.string.errorLoad);
                    Log.e("Camera", e.toString());
                }

            }

}

誰かが私を助けてくれることを願っています...どうすればいいのかわかりません....

前もって感謝します。

よろしく。

4

2 に答える 2

4

160x160 のビットマップのみを表示したいようですが、この行ではビットマップ全体を読み込んでから縮小しています。

imageSelected = android.provider.MediaStore.Images.Media(cr, selectedImage);

inJustDecodeBoundsを使用してビットマップ全体をメモリにロードすることを回避でき、inSampleSizeを使用してスケーリングできます。

これは、大量のビットマップを効率的にロードする Android シリーズのサンプル コードです。

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float)height / (float)reqHeight);
        } else {
            inSampleSize = Math.round((float)width / (float)reqWidth);
        }
    }
    return inSampleSize;
}

public static Bitmap decodeSampledBitmapFromUri(Uri uri,
        int reqWidth, int reqHeight) {


    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
}

次に、160x160 の画像を取得するには、次のようにします。

ivImageLoad.setImageBitmap(decodeSampledBitmapFromUri(selectedImage, 100, 100));
于 2012-11-13T01:55:01.530 に答える
0

おそらく、問題の原因はデフォルトのヒープ サイズです。増やすには次の方法があります。

Android 2.2 以前のバージョンの場合:

dalvik.system.VMRuntime.getRuntime().setMinimumHeapSize(sizeInBytes);

Android 2.3 以降のバージョンの場合:

android:largeHeap="true"

問題の原因がこれであるかどうかを確認し、それに応じてヒープを増やします。

于 2012-11-13T00:26:24.167 に答える