Je suis en train de créer une application dans laquelle je dois sélectionner des photos de la galerie ou en prendre une nouvelle via la caméra. J'ai construit trois activités: une activité qui montre des images sélectionnées/prises, une pour sélectionner des images de la mémoire comme une galerie, et une pour prendre de nouvelles photos avec l'appareil photo. Ce que je fais est: lorsque l'utilisateur clique sur un bouton pour obtenir plus d'images, j'ouvre une chooser intention comme ceci:setContent() pour terminer une activité ne fonctionnant pas sur l'API 16
Intent galleryIntent = new Intent(Constants.INTENT_GALLERY);
Intent cameraIntent = new Intent(Constants.INTENT_PHOTO_CAPTURE);
Intent chooserIntent
= Intent.createChooser(galleryIntent, getString(R.string.title_photo_chooser));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { cameraIntent });
startActivityForResult(chooserIntent, Constants.SUCCESS);
Ensuite, la galerie et la finition de l'activité de la caméra comme ceci:
Et enfin, la première activité, le spectateur, obtient les résultats comme celui-ci:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == RESULT_OK){
if(requestCode == Constants.SUCCESS) {
[...]
}
}
}
cela a été prouvé avec succès sur mon téléphone portable avec l'API 22. Malheureusement, lors de l'exécution sur ma tablette avec API 16, dans onActivityResult()
, resultCode
n'est jamais RESULT_OK
, et intent
est toujours null. J'ai vu beaucoup de solutions comme appeler getParent().setResult()
, mais rien ne semble fonctionner.
Un conseil serait utile. Merci.
EDIT
J'ai analysé avec un débogueur le contenu de mon activité dans les deux versions. Ces états sont l'état de mon activité Gallery
juste avant l'appel au finish()
. Sur API 22, j'ai ceci:
mParent = null
mResultCode = -1
mResultData = {[email protected]} "Intent { (has extras) }"
mAction = null
mCategories = null
mClipData = null
mComponent = null
mContentUserHint = -2
mData = null
mExtras = {[email protected]} "Bundle[{photo=[/storage/emulated/0/DCIM/Camera/....jpg, ...]}]"
mFlags = 0
mLaunchParams = {[email protected]} "DualScreenLaunchParams { mScreen=UNKNOWN mFlags=0 }"
mMultiWindowStyle = null
mPackage = null
mSelector = null
mSourceBounds = null
mType = null
mWindowMode = 0
mWindowPosition = null
mWindowScale = 0.0
shadow$_klass_ = {[email protected]} "class android.content.Intent"
shadow$_monitor_ = -1875875432
API sur 16, j'ai ceci:
mParent = null
mResultCode = -1
mResultData = {[email protected]} "Intent { (has extras) }"
mAction = null
mCategories = null
mClipData = null
mComponent = null
mData = null
mExtras = {[email protected]} "Bundle[{photo=[/storage/sdcard0/Pictures/....jpeg, ...]}]"
mType = null
mPackage = null
mSelector = null
mSourceBounds = null
mFlags = 0
Il y a des différences, mais il semble setContent()
a fait son travail.
Eh bien, comme vous pouvez le voir ci-dessus, 'setResult()' est en effet appelé _before_ 'finish()'. Mais, cela n'aurait pas de sens de l'appeler après, non? De plus, dans chaque réponse que j'ai trouvée, elle est toujours appelée _before_. – Sunshinator