1

ユーザーから写真を取得して、サーバーに送信しようとしています。ギャラリーから選択するか、携帯電話のデフォルトのカメラを使用して新しい写真を撮るという 2 つのオプションを提供します。

ギャラリーは正常に動作し、選択した写真を取得して問題なく送信できます。しかし、カメラ オプションでは、カメラが開き、写真を撮り、指定した場所で SD カードに保存しますが、問題はありませんが、アプリケーションに戻ると、常に NullPointerException が発生し、アプリケーションが強制的に閉じられます。これが私がすることです:

private String tempFilePath = "";    
...
public void addPhotoUsingCamera() {

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    tempFilePath = getOutputMediaFilePath(MEDIA_TYPE_IMAGE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(tempFilePath)));     
    startActivityForResult(intent, CAMERA_ACTIVITY_CODE);
}

そして、次を使用して写真を撮ります。

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

    switch (requestCode) {
    ...
    case CAMERA_ACTIVITY_CODE:
        if (resultCode == Activity.RESULT_OK) {         
            picture = new File(tempFilePath);
        }
        break;
    ...
    }
}

私も試しました

Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ImageView image = (ImageView) findViewById(R.id.photoTaken);
image.setImageBitmap(thumbnail);

内部case CAMERA_ACTIVITY_CODE:ですが、何を試しても、コードのこの部分で常に NullPointerException が発生します。

行 202 が部分に対応する logcat 情報がありcase CAMERA_ACTIVITY_CODE:ます。

01-31 23:40:13.154: ERROR/AndroidRuntime(8009): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=101, result=-1, data=null} to activity {com.ollaa.android/com.ollaa.android.share.ShareFinalScreen}: java.lang.NullPointerException

01-31 23:40:13.154: ERROR/AndroidRuntime(8009): Caused by: java.lang.NullPointerException
01-31 23:40:13.154: ERROR/AndroidRuntime(8009):     at com.ollaa.android.share.ShareFinalScreen.onActivityResult(ShareFinalScreen.java:202)

どんな助けでも大歓迎です。

注: AndroidManifest で、カメラと SD カードに関連するすべての必要なアクセス許可を宣言しました。

編集: tempFilePath は、カメラのアクティビティがアプリに戻るまで持続しないことに気付きました。tempFilePath の初期化をメソッドに入れましたonCreateが、今回は 以外の外部関数からアクセスしようとすると画像が設定されませんonActivityResult。私はJavaをまったく知らないような気がします.関数内でクラス変数を変更すると、変更された値はそのクラスのすべての関数から見えるはずですよね??

4

1 に答える 1

2

使用時:

インテント.putExtra(MediaStore.EXTRA_OUTPUT, myFile);

ファイルは「ディスク」上に存在する必要があります。カメラ アクティビティはそれを作成しません。これはバグです。したがって、使用する必要がありますmyFile.createNewFile();
。また、パスではなくファイルをカメラ アクティビティに送信する必要があります。

次のようなことを試してください:

 tempFilePath = getOutputMediaFilePath(MEDIA_TYPE_IMAGE);
 String fileName = "myPhoto";   
 File myFile = new File (tempFilePath,fileName); 
 myFile.createNewFile();   
 // at this point stop the debugger and check if the file exists on the 'disk'.  
 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(myFile)));

を使用せずにこれを行うより良い方法があるかもしれませんMediaStore.EXTRA_OUTPUT。たぶん、別のユーザーが助けることができます。

また、ユーザーがキャンセルを押して写真を撮らない場合は、ファイルを削除する必要があることに注意してください。

注: Android API 2.2 を使用しています。

これが役立つことを願っています。

于 2012-01-31T23:02:18.077 に答える