Autore Topic: Ricavare foto contatto rubrica  (Letto 4018 volte)

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Ricavare foto contatto rubrica
« il: 27 Settembre 2011, 00:43:51 CEST »
+1
Dopo aver sbattuto la testa per giorni per trovare una soluzione funzionante al problema di ricavare una foto da un contatto, finalmente ci sono riuscito, posto questo piccolo snippet con il quale è possibile ricavare la foto con un oggetto di tipo Bitmap partendo dall'id di un contatto (spero possa venire utile anche ad altri):

Codice (Java): [Seleziona]
public static Bitmap getBitmapByContactId(Activity activity, String id)
        {
            Bitmap photoBitmap = null;

            // Form an array specifying which columns to return.
            String[] projection = new String[] {
                    ContactsContract.Contacts.PHOTO_ID,
                    ContactsContract.Contacts.DISPLAY_NAME
            };

            Uri uri = ContentUris.withAppendedId(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, Long.parseLong(id));
            Cursor idCur = activity.getContentResolver().query(uri, projection, null, null, null);

            if(idCur.moveToFirst())
            {
                final String photoId = idCur.getString(idCur.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
                // Get photo data for this contact
                if(photoId != null)
                {
                    final Cursor photo = activity.managedQuery(
                            Data.CONTENT_URI,
                            new String[] {Photo.PHOTO}, // column for the photo blob
                            Data._ID + "=?", // select row by id
                            new String[] {photoId}, // filter by photoId
                            null
                    );

                    // Convert photo blob to a bitmap
                    if(photo.moveToFirst()) {
                        byte[] photoBlob = photo.getBlob(photo.getColumnIndex(Photo.PHOTO));
                        photoBitmap = BitmapFactory.decodeByteArray(photoBlob, 0, photoBlob.length);
                    }

                    photo.close();
                }

            }
            idCur.close();

            return photoBitmap;
        }

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Ricavare foto contatto rubrica
« Risposta #1 il: 28 Settembre 2011, 23:39:51 CEST »
0
se qualcuno ha una soluzione migliore (soprattutto più veloce) la posti pure :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ricavare foto contatto rubrica
« Risposta #2 il: 29 Settembre 2011, 10:42:21 CEST »
0
Io uso il metodo ContactsContract.Contacts.openContactPhotoInputStream solo che devi passargli l'uri del contatto... dipende con che informazioni parti :)

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Ricavare foto contatto rubrica
« Risposta #3 il: 29 Settembre 2011, 11:06:20 CEST »
0
Io uso il metodo ContactsContract.Contacts.openContactPhotoInputStream solo che devi passargli l'uri del contatto... dipende con che informazioni parti :)
potresti postare il codice del metodo? perchè se risulta più veloce potrebbe venirmi assai utile.. in quanche modo l'uri del contatto lo ricavo :)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ricavare foto contatto rubrica
« Risposta #4 il: 29 Settembre 2011, 11:20:24 CEST »
0
Non c'è molto codice da sapere, chiami quel metodo passandogli l'uri del contatto, lui ti restituisce un InputStream e a quel punto ti basta crearti la bitmap...

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Ricavare foto contatto rubrica
« Risposta #5 il: 29 Settembre 2011, 11:31:17 CEST »
0
Non c'è molto codice da sapere, chiami quel metodo passandogli l'uri del contatto, lui ti restituisce un InputStream e a quel punto ti basta crearti la bitmap...
mmmm.. una cosa del genere? correggimi gli eventuali errori per favore :)
Codice (Java): [Seleziona]
public static Bitmap getBitmapFromUri(Context context, Uri uri){
                InputStream photoStream=ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri);
                if(photoStream!=null){
                        return BitmapFactory.decodeStream(photoStream);
                }
                return null;
        }

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ricavare foto contatto rubrica
« Risposta #6 il: 29 Settembre 2011, 11:42:45 CEST »
0
A me sembra giusto, ma basta farlo girare per saperlo con certezza :P

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Ricavare foto contatto rubrica
« Risposta #7 il: 29 Settembre 2011, 11:45:50 CEST »
0
A me sembra giusto, ma basta farlo girare per saperlo con certezza :P
l'ho infatti appena provato, ricavando così l'uri:
Codice (Java): [Seleziona]
Uri uri = ContentUris.withAppendedId( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, id);ma ovviamente non funziona :)
il LogCat mi segna un errore in questa riga:
Codice (Java): [Seleziona]
InputStream photoStream=ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri);

Offline teo_

  • Utente junior
  • **
  • Post: 72
  • Respect: +1
    • Github
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Windows 7 - Ubuntu 12.10
Re:Ricavare foto contatto rubrica
« Risposta #8 il: 29 Settembre 2011, 11:51:27 CEST »
0
ho sbagliato io :) ricavando in questo modo l'uri non mi da errori ma non mi trova neanche le foto..
Codice (Java): [Seleziona]
Uri uri = ContentUris.withAppendedId( ContactsContract.Contacts.CONTENT_URI, id);

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ricavare foto contatto rubrica
« Risposta #9 il: 29 Settembre 2011, 14:04:59 CEST »
0
Come ricavi l'id utente?
Io sostanzialmente ricevo la foto e altri dati dell'utente a partire dal numero di telefono e faccio in questo modo:

Codice (Java): [Seleziona]
Uri uri = Uri.withAppendedPath( PhoneLookup.CONTENT_FILTER_URI, Uri.encode( number ) );
Cursor c = context.getContentResolver().query( uri, new String[] { PhoneLookup.LOOKUP_KEY }, null, null, null );

if ( c != null && c.getCount() > 0 ) {

        c.moveToFirst();

        Uri lookupUri = Uri.withAppendedPath( ContactsContract.Contacts.CONTENT_LOOKUP_URI, c.getString( 0 ) );
        Uri res = ContactsContract.Contacts.lookupContact( context.getContentResolver(), lookupUri );

        InputStream is = ContactsContract.Contacts.openContactPhotoInputStream( context.getContentResolver(), res );
        //ecc ecc
}

Offline KiwiJuiceTM

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Play Store ID:
    KiwiJuice™
  • Sistema operativo:
    Mac OS X 10.7.4
Re:Ricavare foto contatto rubrica
« Risposta #10 il: 12 Ottobre 2012, 19:51:28 CEST »
0
Salve a tutti,

ho un problema un pò strano. In pratica ho fatto un programma (non sto qui a spiegare cosa fa nel complesso) che ha bisogno di recuperare le foto tramite il numero di telefono.
La stranezza sta nel fatto che il codice che ho usato funziona ottimamente per Android < 2.3.7, ma non funziona per ICS e quindi, credo, per le versioni di Android > 4.0.
Ecco il codice:

Codice (Java): [Seleziona]
       
private Bitmap getContactPhoto(String phoneNumber) {

                Uri phoneUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
                ContentResolver cr = this.getContentResolver();

                Bitmap contactPhoto = null;
                int photoID = 0;
               
                Cursor cur = cr.query(phoneUri, new String[]{PhoneLookup.PHOTO_ID, PhoneLookup.NUMBER}, null, null, null);
               
                if (cur.moveToFirst() == true)
                {
                        photoID = cur.getInt(cur.getColumnIndex(PhoneLookup.PHOTO_ID));

                        Uri photoUri = ContactsContract.Data.CONTENT_URI;
                    cur = cr.query(photoUri, new String[]{ContactsContract.CommonDataKinds.Photo.PHOTO, ContactsContract.Data.PHOTO_ID}, Data.PHOTO_ID + " = " + photoID, null, null);
                       
                        if (cur.moveToFirst() == true)
                        {

                                try
                                {
                                        ByteArrayInputStream rawPhotoStream = new ByteArrayInputStream(cur.getBlob(cur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO)));
                                        contactPhoto = BitmapFactory.decodeStream(rawPhotoStream);
                                        cur.close();

                                        return contactPhoto;
                                }
                                catch (Exception ex)
                                {
                                        System.out.println("Errore in getContactPhoto: "+ex.toString());
                                }

                        }

                }

                Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.profile);
                cur.close();

                return defaultPhoto ;

        }

Ps: Ho notato che il codice
Codice (Java): [Seleziona]
cur.getBlob(cur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO)) mi ritorna un elemento null O_O.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Ricavare foto contatto rubrica
« Risposta #11 il: 13 Ottobre 2012, 12:38:03 CEST »
0
Hai visto il codice che ho postato sopra?
Magari con il metodo ContactsContract.Contacts.openContactPhotoInputStream() risolvi.

Offline KiwiJuiceTM

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Play Store ID:
    KiwiJuice™
  • Sistema operativo:
    Mac OS X 10.7.4
Re:Ricavare foto contatto rubrica
« Risposta #12 il: 13 Ottobre 2012, 13:11:21 CEST »
0
Hai visto il codice che ho postato sopra?
Magari con il metodo ContactsContract.Contacts.openContactPhotoInputStream() risolvi.

Avevo provato, ma ricontrollando funziona. Per la fretta avevo fatto un po di confusione. Grazie per l'aiuto! :)