Mon application permet à l'utilisateur d'appuyer sur un bouton, il ouvre l'appareil photo, il peut prendre une photo et cela s'affichera dans une image. Si l'utilisateur appuie en arrière ou annule pendant que la caméra est ouverte, je force cette fermeture - Échec de livraison du résultat ResultInfo {who = null, demande = 1888, resultat = 0, data = null} à l'activité ... alors je devine le résultat = 0 est le problème que dois-je insérer pour que cette force d'arrêt se ferme?
Ci-dessous mon code. Je sais que j'oublie quelque chose mais je ne peux pas le comprendre! (Certes, il me faut environ 2 semaines pour apprendre le développement Android). Merci pour toute aide!
private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.imageView = (ImageView)this.findViewById(R.id.photostrippic1);
ImageView photoButton = (ImageView) this.findViewById(R.id.photostrippic1);
photoButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent cameraIntent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
});
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
J'imagine que j'aurais besoin d'un "autre" quelque part mais je ne sais pas exactement comment le faire.
ci-dessous est le logcat
Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=0, data=null} to activity {photo.booth.app/photo.booth.app.PhotoboothActivity}: Java.lang.NullPointerException
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2934)
at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:2986)
at Android.app.ActivityThread.access$2000(ActivityThread.Java:132)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1068)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:150)
at Android.app.ActivityThread.main(ActivityThread.Java:4293)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:507)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:849)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:607)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.NullPointerException
at photo.booth.app.PhotoboothActivity.onActivityResult(PhotoboothActivity.Java:76)
at Android.app.Activity.dispatchActivityResult(Activity.Java:4108)
at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2930)
... 11 more
L'ajout de cette première condition devrait fonctionner:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode != RESULT_CANCELED){
if (requestCode == CAMERA_REQUEST) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
}
}
Pour les utilisateurs de Kotlin, n'oubliez pas d'ajouter? en data: Intent?
like
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {}
Si l'utilisateur annule la demande, les données seront retournées sous la forme NULL
. Le thread lancera une nullPointerException
lorsque vous appelez data.getExtras().get("data");
. Je pense que vous avez juste besoin d'ajouter une condition pour vérifier si les données renvoyées sont nulles.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST) {
if (data != null)
{
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
}
Je recommande d'utiliser ceci:
Récupérer le père Intent
.
Intent intentParent = getIntent();
Transmettez le message directement.
setResult(RESULT_OK, intentParent);
Cela empêche la perte de son activité qui générerait une erreur de données nulle.
Pour les utilisateurs de Kotlin
Vous avez juste besoin d'ajouter? avec Intention dans onActivityResult
car les données peuvent être null
si l'utilisateur annule la transaction ou si quelque chose ne va pas. Nous devons donc définir les données comme nullable
dans onActivityResult
Il suffit de remplacer la signature onActivityResult
de SampleActivity par la suivante:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == CAMERE_REQUEST && resultCode == RESULT_OK && data != null)
{
Bitmap photo = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(photo);
}
}
Vous pouvez vérifier si le code de résultat est égal à RESULT_OK. Ce ne sera le cas que si une photo est prise et sélectionnée et que tout fonctionne. Cette clause, si ici, devrait vérifier toutes les conditions.
Ce message d’erreur s’est affiché parce que j’utilisais le réseau sur le fil principal et que les nouvelles versions d’Android appliquent une stratégie "stricte" pour empêcher cela. Pour vous en sortir, jetez n'importe quelle connexion réseau dans une AsyncTask.
Exemple:
AsyncTask<CognitoCachingCredentialsProvider, Integer, Void> task = new AsyncTask<CognitoCachingCredentialsProvider, Integer, Void>() {
@Override
protected Void doInBackground(CognitoCachingCredentialsProvider... params) {
AWSSessionCredentials creds = credentialsProvider.getCredentials();
String id = credentialsProvider.getCachedIdentityId();
credentialsProvider.refresh();
Log.d("wooohoo", String.format("id=%s, token=%s", id, creds.getSessionToken()));
return null;
}
};
task.execute(credentialsProvider);
J'ai également rencontré cette question, je l'ai résolue en ajoutant deux conditions l'une est:
resultCode != null
l'autre est:
resultCode != RESULT_CANCELED
Mon problème était dans l'activité appelée quand il essaie de revenir à l'activité précédente en "finissant". Je fixais mal l’intention. Le code suivant est Kotlin.
Je faisais ceci:
intent.putExtra("foo", "bar")
finish()
Quand j'aurais du faire ça:
val result = Intent()
result.putExtra("foo", "bar")
setResult(Activity.RESULT_OK, result)
finish()
J'ai rencontré ce problème lorsque j'ai essayé de transmettre un objet de modèle sérialisable. À l'intérieur de ce modèle, un autre modèle était une variable, mais il n'était pas sérialisable. C'est pourquoi je fais face à ce problème. Assurez-vous que tout le modèle à l'intérieur d'un modèle est sérialisable.