showDialog() は非推奨になっているため、今すぐ DialogFragments を使用してイメージ ピッカー機能を修正する必要があります。
ここからコードを取得しました。これまでのところ、魅力的に機能しました。
ここでは、簡単にするために、必要なコードラインのみを示します。まず、アクティビティ Aのボタンをクリックして画像を選択すると、ダイアログが表示されます。
ImagePickerFragment ip= new ImagePickerFragment();
ip.show(getSupportFragmentManager(), "imagePicker");
フラグメント コードは次のようになります。
public class ImagePickerFragment extends DialogFragment{
public Dialog onCreateDialog(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//.. creating an adapter
return new AlertDialog.Builder(getActivity())
.setTitle("select Image")
.setAdapter(adapter, new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
if (which == 0){ // from camera
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(Environment.getExternalStorageDirectory(),
"picture_" + String.valueOf(System.currentTimeMillis()) + ".jpg");
mImageCaptureUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
getActivity().startActivityForResult(intent, PICK_FROM_CAMERA);
}
else{ // pick from file
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
getActivity().startActivityForResult(Intent.createChooser(intent, "complete Action..."), PICK_FROM_FILE);
}
}
}).create():
}
}
さて、アクティビティ Aに戻りますonActivityResult() コードは次のようになります。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) return;
if (requestCode == PICK_FROM_FILE){
mImageCaptureUri = data.getData();
path = getRealPathFromURI(mImageCaptureUri); //from Gallery
if (path == null)
path = mImageCaptureUri.getPath(); //from File Manager
}
else path = data.getData().getPath(); **// this is were the Code starts when picture was taken with camera and where the exceptions come from..**
if(path != null){
// do something with image
}
}
これは実際には、ギャラリーから選択された画像には完全に機能しますが、何らかの理由でカメラで撮影された写真には機能しません。カメラがロードされた後、写真を撮ることができます。その写真を保存するために受け入れると、アプリがクラッシュします。
requestCodes は正しいですが、インテントのデータ (つまり、putExtra、バンドル) に個別に入れても、インテントのデータから返される Uri は常に null であることがわかりました。しかし、なぜそれがギャラリーで機能するのか本当に疑問に思っています:-/
多分あなたの一人は私が間違ったことを知っていますか?
PS: 下手な英語で申し訳ありません。
更新:クラッシュ情報を求められました。
09-06 01:58:50.929: E/AndroidRuntime(6322): FATAL EXCEPTION: main
09-06 01:58:50.929: E/AndroidRuntime(6322): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {android.pack.coding/android.myactivitys.MainActivity}: java.lang.NullPointerException
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.app.ActivityThread.access$1100(ActivityThread.java:123)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.os.Handler.dispatchMessage(Handler.java:99)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.os.Looper.loop(Looper.java:137)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.app.ActivityThread.main(ActivityThread.java:4424)
09-06 01:58:50.929: E/AndroidRuntime(6322): at java.lang.reflect.Method.invokeNative(Native Method)
09-06 01:58:50.929: E/AndroidRuntime(6322): at java.lang.reflect.Method.invoke(Method.java:511)
09-06 01:58:50.929: E/AndroidRuntime(6322): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-06 01:58:50.929: E/AndroidRuntime(6322): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-06 01:58:50.929: E/AndroidRuntime(6322): at dalvik.system.NativeStart.main(Native Method)
09-06 01:58:50.929: E/AndroidRuntime(6322): Caused by: java.lang.NullPointerException
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.myactivitys.MainActivity.onActivityResult(MainActivity.java:298)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.app.Activity.dispatchActivityResult(Activity.java:4649)
09-06 01:58:50.929: E/AndroidRuntime(6322): at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
09-06 01:58:50.929: E/AndroidRuntime(6322): ... 11 more