10

「写真の選択」と「写真の撮影」の2つのオプションがあります。写真の選択機能は完全に機能していますが、写真の撮影に問題があります。保存後、主に保存した画像を画像ビューに表示します。

私の写真の場所を定義しました:

public class photoActivity extends Activity {   
      private String photoPath;
      private ImageView imgView;
{...} 

私のカメラリスナー:

bPicFromCam.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state)) {

                long captureTime = System.currentTimeMillis();

                photoPath = Environment.getExternalStorageDirectory() + "/MYAPP" + captureTime + ".jpg";

                getPicFromCam(v);
            }
            else{

                Toast.makeText(getApplicationContext(),
                    "Sorry there is a problem accessing your SDCard, " +
                    "please select a picture from your gallery instead.", Toast.LENGTH_LONG).show();
            }

        }
    });

次に、カメラインテントを開始するためのコード(photoPathが正しいことに注意してください):

    public void getPicFromCam(View view){

    System.out.println("photoPath: " + photoPath);
    //Outputs the CORRECT location!

    try{

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        File photo = new File(photoPath);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(photo));
        imageUri = Uri.fromFile(photo);
        startActivityForResult(Intent.createChooser(intent, "Capture Image"), CAPTURE_IMAGE);

    } catch (Exception e) {
        Toast.makeText(getApplicationContext(),
                getString(R.string.exception_message),
                Toast.LENGTH_LONG).show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
    }
}

OK、この時点まではすべて問題ないようです。写真が撮影され、画像が指定された場所に保存されます。

現在、画像を画像ビューに表示しようとしています(ユーザーが画像の良さを確認した後、画像をアップロードできます)。

私のonActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case PICK_IMAGE:
        if (resultCode == Activity.RESULT_OK) {
            //THIS WORKS
        }
        break;

    case CAPTURE_IMAGE:         

        if (resultCode == RESULT_CANCELED) {
          Toast toast = Toast.makeText(this,"Canceled, no photo selected.", 1000);
          toast.show();
          return;
         }

        if (requestCode == CAPTURE_IMAGE && resultCode == RESULT_OK)
         {

            try {

                System.out.println("photoPath " + photoPath);
                //This is NULL!!!  And my problem, halp!

                BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  
                bitmapOptions.inSampleSize = 6;  
                bitmap = BitmapFactory.decodeFile(photoPath, bitmapOptions);

                imgView.setImageBitmap(bitmap);


            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Internal error",
                        Toast.LENGTH_LONG).show();
                Log.e(e.getClass().getName(), e.getMessage(), e);

            }

         }

        break;
    default:
    }
}

それが私が現在試している方法ですが、onActivityResultで次のものを使用してみました。

bitmap = (Bitmap) data.getExtras().get("data");

しかし、上記の方法を試してみるたびに、NPEを取得します。

編集:

    03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): null
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): java.lang.NullPointerException
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.myco.photoapp.SelectPhoto.onActivityResult(SelectPhoto.java:277)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3115)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.os.Looper.loop(Looper.java:123)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at android.app.ActivityThread.main(ActivityThread.java:4627)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at java.lang.reflect.Method.invokeNative(Native Method)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at java.lang.reflect.Method.invoke(Method.java:521)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391):     at dalvik.system.NativeStart.main(Native Method)

上記のNPEは、次の場合に発生します。

//below is line 277
String result = data.toURI();

                BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();  

                bitmapOptions.inSampleSize = 6;  
                bitmap = BitmapFactory.decodeFile(result, bitmapOptions);
4

4 に答える 4

23

カメラ アクティビティがオフになると、おそらくアクティビティが破棄され、再作成されます。たぶん、photoPath を onSaveInstanceState のバンドルに保存してから、onCreate に戻してみてください (そうするときは、onCreate で null を確認してください)。

于 2011-03-12T00:59:42.493 に答える
4

データを使用することはできません。しかし、次のように変更する必要があると思います

写真は一般変数になります。

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));

したがって、次のフォルダーから取得する必要があります。

Bitmap photo = Media.getBitmap(getContentResolver(), Uri.fromFile(photo) );

私はあなたのコードに従って変更します。

于 2011-04-29T08:45:53.457 に答える
1

基本的に言えば、

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));

うまくいきます

この方法で保存すると画像が非常に大きくなるため、imageView に配置する前に必ず画像を圧縮してください。

int newWidth = bm.getWidth();
int newHeight = bm.getHeight();
while(newWidth > 300){
    newWidth = newWidth/2;
newHeight = newHeight/2;
}
mImagePlaceHolder.setImageBitmap(Bitmap.createScaledBitmap(bm, newWidth, newHeight, false));
于 2014-02-20T06:56:00.827 に答える
1

私はこの問題に苦労し、別の解決策を見つけました: 次のようなコードを使用してください:

Bitmap bitmap = data.getExtras().getParcelable("data");

ビットマップを取得できます。

于 2013-06-21T09:28:04.623 に答える