J'ai une application Android qui contient plusieurs activités.
Dans l'un d'eux, j'utilise un bouton qui appellera la caméra de l'appareil:
public void onClick(View view) {
Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(photoIntent, IMAGE_CAPTURE);
}
Dans la même activité, j'appelle la OnActivityResult
méthode pour le résultat de l'image:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.pic);
imageview.setImageBitmap(image);
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
}
}
}
Le problème est que l'intention data
est nulle et que la OnActivityResult
méthode passe directement à (resultCode == RESULT_CANCELED)
et que l'application retourne à l'activité précédente.
Comment puis-je résoudre ce problème et après avoir appelé la caméra, l'application revient à l'activité en cours qui contient un ImageView
qui contient la photo prise?
Merci
android
android-camera
android-imageview
soft_developer
la source
la source
Réponses:
L'application de caméra Android par défaut renvoie un intent non nul uniquement lors du renvoi d'une miniature dans l'intention renvoyée. Si vous passez
EXTRA_OUTPUT
avec un URI sur lequel écrire, il renverra unenull
intention et l'image se trouve dans l'URI que vous avez passé.Vous pouvez le vérifier en regardant le code source de l'application appareil photo sur GitHub:
https://github.com/android/platform_packages_apps_camera/blob/gingerbread-release/src/com/android/camera/Camera.java#L1186
Je suppose que vous passez d'une
EXTRA_OUTPUT
manière ou d'une autre, ou que l'application appareil photo de votre téléphone fonctionne différemment.la source
J'ai trouvé une réponse facile. Ça marche!!
si vous souhaitez recadrer et redimensionner cette image
la source
FileUriExposedException
moderne du SDK.J'ai rencontré ce problème, le
intent
n'est pas nul mais les informations envoyées via ceintent
ne sont pas reçues dansonActionActivit()
C'est une meilleure solution en utilisant getContentResolver () :
la
onActivityResult()
obtenir une image bitmap stockée par getContentResolver () :Vérifiez mon exemple dans github:
https://github.com/Jorgesys/TakePicture
la source
Application de caméra de travail simple évitant le problème d'intention nulle
- tous les codes modifiés inclus dans cette réponse; proche du tutoriel android
J'ai passé beaucoup de temps sur ce problème, j'ai donc décidé de créer un compte et de partager mes résultats avec vous.
Le didacticiel Android officiel "Prendre des photos simplement" s'est avéré ne pas tenir tout à fait ce qu'il avait promis. Le code qui y est fourni ne fonctionnait pas sur mon appareil: un Samsung Galaxy S4 Mini GT-I9195 exécutant la version Android 4.4.2 / KitKat / API Level 19.
J'ai compris que le problème principal était la ligne suivante dans la méthode invoquée lors de la capture de la photo (
dispatchTakePictureIntent
dans le tutoriel):Il en a résulté que l'intention a été rattrapée par la suite en
onActivityResult
étant nulle.Pour résoudre ce problème, j'ai tiré beaucoup d' inspiration sur les réponses précédentes ici et quelques messages utiles sur GitHub ( la plupart du temps cette un par deepwinter - grand merci à lui, vous pourriez vouloir vérifier sa réponse sur un étroitement lié après aussi).
Suite à ces conseils agréables, j'ai choisi la stratégie de suppression de la
putExtra
ligne mentionnée et de faire la chose correspondante de récupérer la photo prise de la caméra dans la méthode onActivityResult () à la place. Les lignes de code décisives pour récupérer le bitmap associé à l'image sont:J'ai créé une application exemplaire qui a simplement la capacité de prendre une photo, de la sauvegarder sur la carte SD et de l'afficher. Je pense que cela pourrait être utile pour les personnes dans la même situation que moi lorsque je suis tombé sur ce problème, car les suggestions d'aide actuelles se réfèrent principalement à des publications github assez volumineuses qui font la chose en question mais ne sont pas trop faciles à superviser pour les débutants comme moi. En ce qui concerne le système de fichiers qu'Android Studio crée par défaut lors de la création d'un nouveau projet, j'ai juste eu à changer trois fichiers pour mon objectif:
activity_main.xml:
MainActivity.java:
AndroidManifest.xml:
Notez que la solution que j'ai trouvée pour le problème a également conduit à une simplification du fichier manifeste android: les changements suggérés par le tutoriel android en termes d'ajout d'un fournisseur ne sont plus nécessaires puisque je n'en utilise aucun dans mon code java. Par conséquent, seules quelques lignes standard - concernant principalement les autorisations - ont dû être ajoutées au fichier manifeste.
Il peut également être utile de souligner que l'importation automatique d'Android Studio peut ne pas être capable de gérer
java.text.SimpleDateFormat
etjava.util.Date
. J'ai dû les importer tous les deux manuellement.la source
Probablement parce que vous aviez quelque chose comme ça?
Cependant, vous ne devez pas placer la sortie supplémentaire dans l'intention, car les données vont dans l'URI au lieu de la variable de données. Pour cette raison, vous devez prendre les deux lignes au milieu, pour avoir
C'est ce qui a causé le problème pour moi, j'espère que cela a aidé.
la source
Le code suivant fonctionne pour moi:
Et voici le résultat:
la source
imageReturnedIntent.getData()
valeur nulle. Je crée une intention identique à la vôtre. Ne met pas de paramètres supplémentaires.Pour accéder à l'appareil photo et prendre des photos et définir ImageView sur Android
Vous devez utiliser
Uri file = Uri.fromFile(getOutputMediaFile());
pour la guimauve.Utilisez le lien ci-dessous pour obtenir le chemin
https://androidkennel.org/android-camera-access-tutorial/
la source
Code Kotlin qui fonctionne pour moi:
Et obtenez le résultat:
et n'oubliez pas de déclarer le code de requête:
la source
Après de nombreux essais et études, j'ai pu le comprendre. Tout d'abord, les données variables de Intent seront toujours nulles, par conséquent, la vérification
!null
plantera votre application tant que vous passerez un URI à startActivityForResult. Suivez l'exemple ci-dessous. J'utiliserai Kotlin.Ouvrez l'intention de la caméra
} `
Créez le createImageFile (). Mais vous DEVEZ rendre la variable imageFilePath globale. Un exemple sur la façon de le créer est sur la documentation officielle Android et assez simple
Obtenez l'intention
La méthode getBytesFromBitmap
J'espère que ça aide.
la source
Lorsque nous capturerons l'image de la caméra dans Android, Uri ou
data.getdata()
devient nul. nous avons deux solutions pour résoudre ce problème.Je vais mettre en œuvre toutes les méthodes ici, veuillez regarder attentivement et lire celles-ci: -
Tout d'abord, je vais dire comment obtenir Uri à partir de l'image Bitmap: le code complet est:
Tout d'abord, nous capturerons l'image via Intent qui sera la même pour les deux méthodes, donc ce code je n'écrirai qu'une seule fois ici:
Maintenant, nous allons implémenter OnActivityResult :-( Ce sera la même chose pour les deux méthodes ci-dessus 2): -
Nous allons maintenant créer toutes les méthodes ci-dessus pour créer des Uri à partir des méthodes Image et Cursor via des classes:
Maintenant le chemin URI de l'image Bitmap
\ Uri du chemin réel de l'image enregistrée
la source
Lorsque nous capturons l'image de l'appareil photo sous Android,
Uri
oudata.getdata()
devient nul. Nous avons deux solutions pour résoudre ce problème.Voici comment récupérer l'URI de l'image bitmap. Première capture d'image via Intent qui sera la même pour les deux méthodes:
Maintenant, implémentez
OnActivityResult
, qui sera le même pour les deux méthodes:Maintenant, créez toutes les méthodes ci-dessus pour créer l'URI à partir des méthodes Image et Cursor:
Chemin Uri de l'image Bitmap:
Uri du chemin réel de l'image enregistrée:
la source