Je suis les instructions sur Appareil photo sur Site de développement Android
Je viens de commencer l'objectif de la caméra, pas construire ma propre caméra.
L'exemple de code permettant de gérer le retour du résultat après avoir pris une photo est le suivant.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
}
resultCode
est OK, mais data
est toujours NULL, ce qui provoque un NPE. J'ai regardé dans la carte SD, la photo était vraiment enregistrée là-bas. Une astuce? tks beaucoup.
Mise à jour: informations logcat comme demandé:
01-28 19:39:00.547: ERROR/AndroidRuntime(24315): FATAL EXCEPTION: main
Java.lang.RuntimeException: Unable to resume activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: Java.lang.NullPointerException
at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2455)
at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:2483)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1997)
at Android.app.ActivityThread.handleRelaunchActivity(ActivityThread.Java:3362)
at Android.app.ActivityThread.access$700(ActivityThread.Java:127)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1162)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4511)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:980)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:747)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: Java.lang.NullPointerException
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2991)
at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2442)
... 13 more
Caused by: Java.lang.NullPointerException
at com.example.CameraTest.MyCamera.onActivityResult(MyCamera.Java:71)
at Android.app.Activity.dispatchActivityResult(Activity.Java:4654)
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2987)
... 14 more
Le problème avec votre code est le suivant:
data.getData()
Cet appel n'obtient pas le extra avec la clé "data" du Intent
renvoyé. Il obtient le champ data
à partir du Intent
renvoyé, qui est probablement null
.
Vous devez obtenir le supplément du Intent
retourné comme ceci:
data.getExtras().get("data");
Certaines des autres réponses l'ont indiqué, intégrées à des tonnes d'autres codes. Cela rend difficile de voir réellement quel est le problème.
Voici la réponse d'une question similaire . Il semble que cela pourrait être un problème avec les téléphones Samsung ...
Fondamentalement, si vous avez un code comme celui-ci qui crée l'intention:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
Ensuite, dans onActivityResult
, replace data.getData()
avec fileUri.toString()
et votre problème sera résolu.
Utilisez la solution de @ KJ50 et utilisez savedInstanceState
pour vous assurer que vous n'obtenez pas la valeur null.
/**
* Here we store the file url as it will be null after returning from camera
* app
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save file url in bundle as it will be null on screen orientation
// changes
outState.putParcelable("file_uri", fileUri);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// get the file url
fileUri = savedInstanceState.getParcelable("file_uri");
}
Essayez ci-dessous le code:
Button m_btnCamera; ImageView m_ivCaptureImage; String m_curentDateandTime; String m_imagePath; Bitmap m_bitmap; //Start camera to caputre image. Intent m_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); m_intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri()); startActivityForResult(m_intent, TAKE_PHOTO_CODE); private Uri getImageUri() throws CustomException { Uri m_imgUri = null; File m_file; try { SimpleDateFormat m_sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); m_curentDateandTime = m_sdf.format(new Date()); m_imagePath = File.getPath() + File.separator + m_curentDateandTime + ".jpg"; m_file = new File(m_imagePath); m_imgUri = Uri.fromFile(m_file); } catch (Exception p_e) {} return m_imgUri; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { m_bitmap = ImageHelper.scaleImage(m_imagePath, 200, 200); m_bitmap = ImageHelper.rotateImage(m_bitmap, true, m_rotate); m_ivCaptureImage.setImageBitmap(m_bitmap); } } }
Ce code vous aidera
La méthode getData () renvoie des données uniquement si la version d'Android est plus récente que M, sinon elle renverra un résultat nul.
if (resultCode == Activity.RESULT_OK) {
//Check Android version, as intent.getData() will return data only if v is above or equal to M otherwise the data will be null
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
Uri selectedImageURI = imageReturnedIntent.getData();
Toast.makeText(getActivity(), "URI Path:" + selectedImageURI, Toast.LENGTH_LONG).show();
} else {
Bitmap photo = (Bitmap) imageReturnedIntent.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), photo, "Title", null);
Uri selectedImageURI = Uri.parse(path);
Toast.makeText(getActivity(), "URI Path:" + selectedImageURI, Toast.LENGTH_LONG).show();
}
}
Essaye ça
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICK_IMAGE_ID:
Bitmap bitmap = ImagePicker.getImageFromResult(this.getActivity(), resultCode, data);
if(data!=null){
//set image view
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}