0

したがって、android.media.action.IMAGE_CAPTURE からデータを取得するだけの品質の問題により、アクティビティを呼び出してローカルの一時ファイルを保存し、そこからビットマップを作成する必要があったようです。このビットマップは正方形にトリミングされ、ImageView に設定されてから、ローカルに保存されます。しかし、私はいくつかの問題を抱えています。すべて(今のところトリミングを除く)は、画像を設定し(空白の画像を返します)、内部に保存するまで機能し、その時点でクラッシュします。ファイルマネージャーでSDカード上のファイルを探してみましたが、フォルダすら表示されず、本当にファイルが作成されているのかさえわかりません。私が間違っていることはありますか?コード:

private static final String TAG = "AddEdit";
private final static String FOLDER_NAME = "com.ex.beerlog/Image/";
private Uri selectedImageUri = null;
private final static int CAPTURE_IMAGE_CALLBACK = 1;


switch (arg0.getId()) {
            case R.id.imageView1:

                File photo = null;
                Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

                if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
                    photo = new File(android.os.Environment.getExternalStorageDirectory(), FOLDER_NAME + File.separator
                            + "temp.png");
                    Log.w(TAG, "*******Photo path set from Enviro*********");
                } else {
                    photo = new File(getCacheDir(), FOLDER_NAME + File.separator + "temp.png");
                    Log.w(TAG, "*******photo set from cache*********");
                }
                if (photo != null) {
                    Log.w(TAG, "*******Photo is not null*********");
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
                    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
                    selectedImageUri = Uri.fromFile(photo);
                    Log.w(TAG, "*******from imageUri=" + selectedImageUri + "*********");
                    startActivityForResult(intent, CAPTURE_IMAGE_CALLBACK);
                }
 break;



  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case CAPTURE_IMAGE_CALLBACK:
                if (resultCode == RESULT_OK) {
                    String path = selectedImageUri.toString();
                    Log.w(TAG, "*****path set =" + path + "******");
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    Log.w(TAG, "*****Bimapfactory options set******");
                    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                    Log.w(TAG, "****Options defined********");
                    bmp = BitmapFactory.decodeFile(path, options);
                    Log.w(TAG, "*****Bmp is set ==> crop******");

                    brewPhoto.setImageBitmap(bmp);
                    Log.w(TAG, "******************Image is set to ButtonImage**********************");
                    // Store image
                    FileOutputStream fos;
                    Log.w(TAG, "********FileOutPutStream created*************");
                    try {
                        fos = openFileOutput(cDate, Context.MODE_PRIVATE);
                        Log.w(TAG, "********FileOutPutStream defined*************");
                        bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
                        Log.w(TAG, "********bitmap compressed*************");
                        fos.close();
                        Log.w(TAG, "*****FOS closed**********");
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
        }
    }

私が受け取ったエラーログは次のとおりです。

03-18 21:24:50.325: W/AddEdit(8208): *****path set =file:///storage/sdcard0/com.ex.beerlog/Image/temp.png******
03-18 21:24:50.325: W/AddEdit(8208): *****Bimapfactory options set******
03-18 21:24:50.325: W/AddEdit(8208): ****Options defined********
03-18 21:24:50.325: I/System.out(8208): Not a DRM File, opening notmally
03-18 21:24:50.325: W/AddEdit(8208): *****Bmp is set ==> crop******
03-18 21:24:50.325: W/AddEdit(8208): ******************Image is set to ButtonImage**********************
03-18 21:24:50.325: W/AddEdit(8208): ********FileOutPutStream created*************
03-18 21:24:50.325: W/AddEdit(8208): ********FileOutPutStream defined*************
03-18 21:24:50.335: W/dalvikvm(8208): threadid=1: thread exiting with uncaught exception (group=0x41314438)
03-18 21:24:50.335: E/AndroidRuntime(8208): FATAL EXCEPTION: main
03-18 21:24:50.335: E/AndroidRuntime(8208): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.ex.beerlog/com.ex.beerlog.AddEdit}: java.lang.NullPointerException
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3183)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3226)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.app.ActivityThread.access$1200(ActivityThread.java:139)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.os.Looper.loop(Looper.java:137)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.app.ActivityThread.main(ActivityThread.java:4918)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at java.lang.reflect.Method.invokeNative(Native Method)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at java.lang.reflect.Method.invoke(Method.java:511)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at dalvik.system.NativeStart.main(Native Method)
03-18 21:24:50.335: E/AndroidRuntime(8208): Caused by: java.lang.NullPointerException
03-18 21:24:50.335: E/AndroidRuntime(8208):     at com.ex.beerlog.AddEdit.onActivityResult(AddEdit.java:329)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.app.Activity.dispatchActivityResult(Activity.java:5232)
03-18 21:24:50.335: E/AndroidRuntime(8208):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3179)
03-18 21:24:50.335: E/AndroidRuntime(8208):     ... 11 more

ご覧のとおり、fileInputSteam は作成されますが、イメージを保存しようとするとクラッシュします。このコード セグメントを削除したところ、ImageView に設定された画像は空白 (透明) になります。実際には何もないので、クラッシュしていると思いますか?マニフェストで SD カードへのアクセスを許可する権限を設定しようとしました。また、デバッガーを有効にして、Galaxy sIII でテストしていることにも注意してください。また、SD カードの保護を解除し、電話機のプラグを抜いて SD カードが使用可能であることを確認しましたが、毎回同じ結果です。

再度、感謝します。ここにいる皆さんは、このことでかなり素晴らしいです!

4

1 に答える 1

0

さて、私は自分の問題を理解しました。うまくいけば、これはこの問題で私のような他の人を助けるでしょう.

要するに、カメラの意図から高品質の情報を収集したい場合は、(私が見つけたものから) 画像を SD カードに保存する必要があります。画像が存在しなかったため、アプリケーションは空白の (透明だと思っていた) 画像を返していました。 ファイル パスを作成する必要があります。これは自動プロセスではありません。

静的パスを設定するだけでこれを達成し、その場所に temp.png を作成しました。

File photo = null;
File path = new File("storage/sdcard0/Android/data/com.ex.beerlog/");
String pathstring = path.toString();
if (!path.exists()) {
    path.mkdirs();
    Log.w(TAG, "*******Photo Directory Created*********");
} else { // do nothing }

最後に、キャプチャした写真を内部に保存したかったのですが、画像サイズが原因でメモリ不足 (OOM) 例外が発生しました。これを改善するために、画像を幅 350px に縮小するマトリックスを作成しました (実際には、アプリケーションで必要な最大サイズの画像です)。**「matrix.postrotate(90)」に気付くでしょう。これは、そうしないと私の写真が横に戻ってしまうためです。

 private Bitmap cropImage(Bitmap bmp2) {
     // TODO Auto-generated method stub
     int width = bmp2.getWidth();
     int height = bmp2.getHeight();
     float scale = (float) 350/bmp.getHeight();
       
     Log.w(TAG, "*********Image Wt=" + width + ", Ht=" + height + " scale" + scale + "*********");

     Matrix matrix = new Matrix();
     matrix.postScale(scale, scale);
     matrix.postRotate(90);

     // recreate the new Bitmap
     Bitmap resizedBitmap = Bitmap.createBitmap(bmp2, 0, 0, width, height, matrix, true);
     int bmpHtWidth = resizedBitmap.getWidth();
     int bmpHeight = resizedBitmap.getHeight();
     int bmpTop = (bmpHeight - bmpHtWidth) / 2;
     Log.w(TAG, "*********resizedImage HtWt=" + bmpHtWidth + ", Ht=" + bmpHeight + ", top=" + bmpTop + "*********");

     return resizedBitmap;
 }

これらは本質的に上記の私の質問に答えました。それが他の誰かにも役立つことを願っています!

編集:ああ、最後に、アクティビティの合間に少し写真に夢中になったときに問題に遭遇し、OutOfMemoryException が発生しました。これを修正するために、アクティビティを閉じて次のアクティビティに移動する前に Bitmap.recycle() 関数を使用しました。これにより、アクティビティ間でメモリの解放が試みられます。

于 2013-03-20T02:33:57.683 に答える