2016-07-08 1 views
1

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.

Répondre

0

Enfin, je suis arrivé au problème. La clé était dans le doc pour startActivityForResult. Par exemple, si l'activité que vous lancez utilise le mode de lancement singleTask, il ne s'exécutera pas dans votre tâche et vous recevrez immédiatement un résultat d'annulation. J'utilisais en effet singleTask comme mode de lancement. Je suis passé à singleTop et cela a fonctionné. J'étudie les modes de lancement pour que tout fonctionne.

-1

Assurez-vous que setResult n'est pas appelée avant finish()

+0

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