Autore Topic: Create chooser non passa parametri a OnActivityResult  (Letto 362 volte)

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Create chooser non passa parametri a OnActivityResult
« il: 04 Maggio 2017, 15:17:25 CEST »
0
Ciao a tutti
sto inserendo nell'app la possibilità di scegliere una foto dalle gallerie oppure scattarne una e reperirla, per poi caricarla in una imageview.
Per far ciò utilizzo createChooser nel seguente modo:
Codice (Java): [Seleziona]
 ((Button) v.findViewById(R.id.buttonCarica)).setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View arg0) {
                // Camera.
                final List<Intent> cameraIntents = new ArrayList<Intent>();
                final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                final PackageManager packageManager = cont.getPackageManager();
                final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
                for(ResolveInfo res : listCam) {
                    final String packageName = res.activityInfo.packageName;
                    final Intent intent = new Intent(captureIntent);
                    intent.setComponent(new ComponentName(packageName, res.activityInfo.name));
                    intent.setPackage(packageName);
                    cameraIntents.add(intent);}
                // Filesystem.
                final Intent galleryIntent = new Intent();
                galleryIntent.setType("image/*");
                galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                galleryIntent.putExtra("dafile", true);
                // Creo Chooser con filesystem options.
                final Intent chooserIntent = Intent.createChooser(galleryIntent, "Seleziona azione");
                // Aggiungo camera options.
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));

               startActivityForResult(chooserIntent, SELECT_PICTURE);
            }
        });

poi tornando indietro:
Codice (Java): [Seleziona]
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK)
            if (requestCode == SELECT_PICTURE) {
                if (data.hasExtra("dafile"))
                {
                    //da qui non passa mai !
                    System.out.println("data_data: dafile");
                }
                boolean isCamera= false;
                try
                {
                  String action = data.getAction();
                  System.out.println("data_action: " + action);
                  if (action.equals("inline-data"))
                      isCamera = true;
                }
                catch(Exception e)
                {
                   isCamera= false;
                   System.out.println("data_action: " + "excption");
                }
                Uri selectedImageUri = null;
                File picture;
                if (isCamera) {
                    Bitmap bmp = (Bitmap) data.getExtras().get("data");
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
                    byte[] byteArray = stream.toByteArray();
                    // convert byte array to Bitmap
                    Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0,
                            byteArray.length);
                    img.setImageBitmap(bitmap);
                }
                else
                {
                    selectedImageUri = data == null ? null : data.getData();
                    selectedImagePath = getPath(selectedImageUri);
                    picture = new File(selectedImagePath);
                    if (picture.exists()) {
                        //*** Riduco il filesize altrimenti da OutOfMemory Exception ***
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inSampleSize = 3; // size = 1/3 dell'immagine originale
                        Bitmap myBitmap = BitmapFactory.decodeFile(picture.getAbsolutePath(), options);
                        img.setImageBitmap(myBitmap);
                    }
                }
        }
    }
Il problema è che non ricevo il parametro extra "dafile" x capire che l'azione scelta è quella di ricerca immagine anzichè quella di scattare una foto. Mi sono arrabattato un po capendo che se data.getaction() è null allora il file proviene dalla galleria altrimenti dalla camera. Ma non sono molto convinto dellà bontà del mio ragionamento, anche se a dir il vero sembra corretto e funziona.
Quindi esiste una maniera per capire cosa l'utente ha fatto di ritorno da questa activity "chooser"?
grazie
a presto
Nicola


Offline iClaude

  • Utente normale
  • ***
  • Post: 311
  • Respect: +25
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:Create chooser non passa parametri a OnActivityResult
« Risposta #1 il: 04 Maggio 2017, 20:59:13 CEST »
0
Il campo "dafile" è contenuto nell'Intent con cui lanci l'Activity per selezionare l'immagine dalla galleria, e quindi è ricevuto da questa Activity.
L'Intent passato al metodo onActivityResult è diverso, ed è quello restituito dall'Activity che hai chiamato (quella per selezionare l'immagine dalla galleria, oppure dalla fotocamera). Non può quindi contenere il campo "dafile".

Senza cercare di capire quale Activity è stata chiamata in base al contenuto dell'Intent restituito, la soluzione al tuo problema è molto più semplice:
Controlli la scelta fatta dall'utente e in base a questa usi 2 distinti metodi startActivityForResult con diversi campi requestCode, es.: SELECT_PICTURE e TAKE_PICTURE.
Ciao.

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Create chooser non passa parametri a OnActivityResult
« Risposta #2 il: 05 Maggio 2017, 09:48:24 CEST »
0
Ciao iClaude,
grazie x il tuo suggerimento,
se ben ho capito, la tua soluzione prevede prima la visualizzazione di un semplice AllertDialog tipo esempio così:
Codice (Java): [Seleziona]
imageViewRound.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            selectImage();
        }
    });
    private void selectImage() {
    Constants.iscamera = true;
    final CharSequence[] items = { "Take Photo", "Choose from Library",
            "Cancel" };
    AlertDialog.Builder builder = new AlertDialog.Builder(AddContactActivity.this);
    builder.setTitle("Add Photo!");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals("Take Photo")) {
                Intent intents = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
                intents.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
                // start the image capture Intent
                startActivityForResult(intents, TAKE_PICTURE);
            } else if (items[item].equals("Choose from Library")) {
                Intent intent = new Intent(Intent.ACTION_PICK,  android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
            } else if (items[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case SELECT_PICTURE:
        Bitmap bitmap = null;
        if (resultCode == RESULT_OK) {
           ...}
                        break;
    case TAKE_PICTURE:
        if (resultCode == RESULT_OK) {
            ...;

        }

        break;
                }
}

Intendevi una soluzione di questo tipo ?

Grazie

Offline iClaude

  • Utente normale
  • ***
  • Post: 311
  • Respect: +25
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:Create chooser non passa parametri a OnActivityResult
« Risposta #3 il: 05 Maggio 2017, 10:00:52 CEST »
0
Sì esatto.

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Create chooser non passa parametri a OnActivityResult
« Risposta #4 il: 05 Maggio 2017, 18:25:50 CEST »
0
Ciao iClaude,
      ho provato anche la seconda soluzione e funziona bene.
L'unico appunto è che a livello estetico e di utilizzo è meglio far vedere le opzioni possibili in un unico "chooser" che far selezionare all' utente 2 volte con 2 dialog diversi presentati uno di seguito all'altro...infatti un app a caso (WhatsApp) O:-) utilizza la prima soluzione... :-)