D'activité de la caméra retourner null android
Je suis la construction d'une application où je veux capturer une image par la caméra par défaut de l'activité et de retourner à mes activités et de charger cette image dans une ImageView. Le problème, c'est une activité de la caméra retourne toujours null. Dans mon onActivityResult(int requestCode, int resultCode, Intent data)
méthode que je suis l'obtention de données comme null
. Voici mon code:
public class CameraCapture extends Activity {
protected boolean _taken = true;
File sdImageMainDirectory;
Uri outputFileUri;
protected static final String PHOTO_TAKEN = "photo_taken";
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
setContentView(R.layout.cameracapturedimage);
File root = new File(Environment
.getExternalStorageDirectory()
+ File.separator + "myDir" + File.separator);
root.mkdirs();
sdImageMainDirectory = new File(root, "myPicName");
startCameraActivity();
} catch (Exception e) {
finish();
Toast.makeText(this, "Error occured. Please try again later.",
Toast.LENGTH_SHORT).show();
}
}
protected void startCameraActivity() {
outputFileUri = Uri.fromFile(sdImageMainDirectory);
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE:
{
if(resultCode==Activity.RESULT_OK)
{
try{
ImageView imageView=(ImageView)findViewById(R.id.cameraImage);
imageView.setImageBitmap((Bitmap) data.getExtras().get("data"));
}
catch (Exception e) {
//TODO: handle exception
}
}
break;
}
default:
break;
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) {
_taken = true;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken);
}
}
Je fais quelque chose de mal?
- est la sdcard monté? où u en mesure de voir l'image 'myPicName'? et u ont les autorisations dans le manifeste? <uses-permission android:name="android.la permission.WRITE_EXTERNAL_STORAGE" />
- Je peux voir le fichier dans le ddms tandis que le débogage usb. Et j'ai aussi donné la permission. Si j'utilise outputFileUri au lieu de données lors du chargement de l'image dans l'imageview il fonctionne. Cela signifie que la caméra capture l'image, mais pourquoi je suis null en paramètre de données de onactivityresult() la méthode
- est-ce un téléphone Samsung?
Vous devez vous connecter pour publier un commentaire.
Vous obtenez tort parce que vous le faites de manière erronée.
Si vous passez le paramètre supplémentaire
MediaStore.EXTRA_OUTPUT
avec l'appareil photo de l'intention de l'appareil de l'activité d'écriture de l'image capturée à ce chemin et il ne sera pas de retour l'image bitmap dans leonActivityResult
méthode.Si vous vérifiez le chemin d'accès qui vous sont de passage, alors vous saurez que fait la caméra a écrire le fichier capturé dans cette voie.
Pour de plus amples informations, vous pouvez suivre cette, cette et cette
Intent
reviendranull
si vous spécifier l'URI pour l'enregistrer. Vous devriez toujours être en mesure d'accéder à laIntent
et prenez la photo de l'URI de l'informatique, etc.MediaStore.EXTRA_OUTPUT
avec l'appareil photo de l'intention, mais vous devez enregistrer le fileUri comme une variable de membre alors, elle peut être consulté dansonActivityResult()
.onActivityResult()
data.getData()
censé renvoyer l'uri de l'image enregistrée. La DROITE!Je suis de le faire d'une autre manière. Les données.getData() champ n'est pas garanti pour le retour d'un Uri, donc je vérifie si elle est null ou pas, si elle est alors l'image est en extras. De sorte que le code serait -
Je suis en utilisant ce code dans l'application de production, et ça fonctionne.
data
est null, comment vous pouvez appelergetData()
?Uri from image
par le biais de ces codes :public static Uri getImageUri(Context inContext, Bitmap inImage) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null); return Uri.parse(path); }
data.getExtras.get("data")
pouvez le chemin de retour si nous n'avons pas d'envoyer tout putExtra d'Intention?J'ai eu un problème similaire. J'avais commenté quelques lignes dans mon fichier de manifeste qui a causé la vignette de données à renvoyer null.
Vous avez besoin des éléments suivants pour obtenir que cela fonctionne:
J'espère que cela résout votre problème
Si votre téléphone est un Samsung, il pourrait être lié à cette http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/
Il y a un autre question ouverte qui peut donner des informations supplémentaires
Si vous utilisez une ImageView pour afficher le Bitmap renvoyée par la Caméra Intention
vous avez besoin pour économiser de l'imageview de référence à l'intérieur de onSaveInstanceState et aussi de les restaurer plus tard à l'intérieur de onRestoreInstanceState. Découvrez le code pour onSaveInstanceState et onRestoreInstanceState ci-dessous.
après de nombreuses recherche :
Essayer de code suivant
Vous pouvez générer image à partir du fichier que vous envoyez à la caméra intention. Veuillez utilisez ce code...
Essayer ce tutoriel. Il fonctionne pour moi et à l'utilisation d'autorisation comme d'habitude dans le manifeste & aussi
de vérifier la permission
https://androidkennel.org/android-camera-access-tutorial/
Après beaucoup d'une recherche intensive, je suis finalement arrivé à une conclusion.
Pour ce faire, vous devez enregistrer l'image capturée pour le stockage externe.
Et puis,récupérer pendant le téléchargement.
De cette façon, l'image res ne se dégrader et vous n'obtenez pas l'exception NullPointerException trop!
J'ai utilisé horodatage nom du fichier afin de nous obtenir un nom de fichier unique à chaque fois.
Fonction pour créer un nom de fichier :
et la onActivityResult:
Espère que cela aide 🙂
Edit: accorder des autorisations pour l'appareil-photo et d'écrire et de lire de stockage dans votre manifeste.