JavascriptProva

venerdì 19 maggio 2017

Permessi di disegno di un overlay nelle API da 23 in su

Ecco il codice:
public class MainActivity extends AppCompatActivity {

    Intent i;
    RelativeLayout mainLayout;
    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);

        if(Build.VERSION.SDK_INT>=23 && !Settings.canDrawOverlays(this)){
                Intent intent=new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:"+getPackageName())
                );
                startActivityForResult(intent,0);

        }else {
        i = new Intent(this, Servizio.class);
        startService(i);
        }

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(Build.VERSION.SDK_INT>=23) {
            if (Settings.canDrawOverlays(this)) {
                i = new Intent(this, Servizio.class);
                startService(i);

            }
        }
    }
}


Service:
public class Servizio extends Service {


    Bitmap bitmap;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

   
    @Override
    public int onStartCommand(Intent intent, int flags, int startId){


        bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.scrofalo);
        RoundedImage image=new RoundedImage(this,bitmap,200);
        WindowManager windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);

        WindowManager.LayoutParams params=new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );

        windowManager.addView(image,params);
        return START_NOT_STICKY;
    }

}
Chiama la classe RoundedImage, che ho creato e messo in una libreria.

mercoledì 17 maggio 2017

Immagine tonda fluttuante sullo schermo

Immagine rotonda fluttuante sullo schermo.

MainActivity.java:
public class MainActivity extends Activity {


    Button button;
    Button button2;
    Button button3;
    ImageView imageView;
    RelativeLayout mainLayout;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=(Button)findViewById(R.id.button);
        button2=(Button)findViewById(R.id.button2);
        button3=(Button)findViewById(R.id.button3);
        imageView=new ImageView(this);
        mainLayout=(RelativeLayout)findViewById(R.id.activity_main);


        Intent intent=new Intent(getApplicationContext(),ChatHeadService.class);
        startService(intent);

        button.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {

            }
        });
        
    }
}


RoundedImage.java:
public class RoundedImage extends ImageView{

    private Bitmap figura;
    private int radius;



    public RoundedImage(Context context, Bitmap figura, int radius){
        super(context);

        this.figura=figura;
        this.radius=radius;

        Bitmap bitmap=Bitmap.createBitmap(radius,radius,Bitmap.Config.ARGB_8888);

        Paint paint=new Paint();
        Canvas canvas=new Canvas(bitmap);
        canvas.drawCircle(bitmap.getWidth()/2,bitmap.getHeight()/2,bitmap.getWidth()/2,paint);

        Rect fromRect=new Rect(0,0,figura.getWidth(),figura.getHeight());
        Rect toRect=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

        canvas.drawBitmap(figura,fromRect,toRect,paint);

        setImageBitmap(bitmap);
    }
}


ChatHeadService.java:
public class ChatHeadService extends Service {

    WindowManager manager;
    WindowManager.LayoutParams params;
    RoundedImage image;

    int initialX,initialY,initialTouchX,initialTouchY;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate(){
        super.onCreate();
        System.out.println("TEST");
        manager=(WindowManager)getSystemService(WINDOW_SERVICE);

                params=new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );

        params.gravity= Gravity.TOP | Gravity.LEFT;
        params.x=100;
        params.y=100;

        image=new RoundedImage(this,
                BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo),
                100
        );

        manager.addView(image,params);


        image.setOnTouchListener(new View.OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        initialX=params.x;
                        initialY=params.y;
                        initialTouchX=(int)event.getRawX();
                        initialTouchY=(int)event.getRawY();
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        params.x=initialX+(int)(event.getRawX()-initialTouchX);
                        params.y=initialY+(int)(event.getRawY()-initialTouchY);
                        manager.updateViewLayout(image,params);
                        return true;
                }

                return false;
            }
        });
    }

}


POST SCRIPTUM: Ho scoperto che tutto questo è valido fino all'API 22.
Con la 23, Marshmallow, è più complicato avere il permesso di caricare un'immagine su WindowManager.

Ecco il codice, comunque:
public class MainActivity extends AppCompatActivity {

    WindowManager.LayoutParams params;
    WindowManager windowManager;
    ImageView imageView;
    Bitmap bitmap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView=new ImageView(this);

        windowManager=(WindowManager)getSystemService(WINDOW_SERVICE);
        bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.scrofalo);
        imageView.setImageBitmap(bitmap);

        params=new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );
        params.gravity= Gravity.TOP | Gravity.LEFT;

        if(Build.VERSION.SDK_INT>=23) {
            if (!Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                        Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent,0);

            }
            else{
                windowManager.addView(imageView, params);
            }
        }else {
            windowManager.addView(imageView, params);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        System.out.println("RESULT");

        if(Build.VERSION.SDK_INT>=23){
            if(Settings.canDrawOverlays(this)){
                windowManager.addView(imageView, params);
            }

        }


    }


}

lunedì 15 maggio 2017

Aggiunta di una ImageView rotonda alla finestra

Codice per l'aggiunta di una ImageView contenente una bitmap rotonda alla finestra.

MainActivity:
public class MainActivity extends Activity {


    Button button;
    Button button2;
    Button button3;
    ImageView imageView;
    RelativeLayout mainLayout;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=(Button)findViewById(R.id.button);
        button2=(Button)findViewById(R.id.button2);
        button3=(Button)findViewById(R.id.button3);
        imageView=new ImageView(this);
        mainLayout=(RelativeLayout)findViewById(R.id.activity_main);

        WindowManager windowManager=(WindowManager) getSystemService(WINDOW_SERVICE);

        WindowManager.LayoutParams wParams= new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT
        );

        Bitmap b= BitmapFactory.decodeResource(getResources(),R.drawable.gatto);
        RoundedImage roundedImage=new RoundedImage(this,b,200);

        windowManager.addView(roundedImage,wParams);
    }
}


RoundedImage:
public class RoundedImage extends ImageView{

    private Bitmap figura;
    private int radius;

    public RoundedImage(Context context, Bitmap figura, int radius){
        super(context);

        this.figura=figura;
        this.radius=radius;

        Bitmap bitmap=Bitmap.createBitmap(radius,radius,Bitmap.Config.ARGB_8888);

        Paint paint=new Paint();
        Canvas canvas=new Canvas(bitmap);
        canvas.drawCircle(bitmap.getWidth()/2,bitmap.getHeight()/2,bitmap.getWidth()/2,paint);

        Rect fromRect=new Rect(0,0,figura.getWidth(),figura.getHeight());
        Rect toRect=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

        canvas.drawBitmap(figura,fromRect,toRect,paint);

        setImageBitmap(bitmap);

    }
}
E accidenti, se funziona!

Immagini rotonde in Android

Ecco il codice:
public class MainActivity extends Activity {


    Button button;
    Button button2;
    Button button3;
    ImageView imageView;
    RelativeLayout mainLayout;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=(Button)findViewById(R.id.button);
        button2=(Button)findViewById(R.id.button2);
        button3=(Button)findViewById(R.id.button3);
        imageView=new ImageView(this);
        mainLayout=(RelativeLayout)findViewById(R.id.activity_main);


        Bitmap bitmap= Bitmap.createBitmap(300,300,Bitmap.Config.ARGB_8888);
        Bitmap immagine= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo);

        Paint paint=new Paint();

        paint.setColor(Color.BLUE);
        Canvas canvas=new Canvas(bitmap);

        canvas.drawCircle(bitmap.getWidth()/2,bitmap.getHeight()/2,bitmap.getWidth()/2,paint);

        Rect rect1=new Rect(0,0,426,426);
        Rect rect=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());


        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(immagine,rect1,rect,paint);

        imageView.setImageBitmap(bitmap);

        mainLayout.addView(imageView);
        imageView.bringToFront();

    }
}
Descriviamo i passaggi ordinatamente, in modo da cercare di memorizzarli.
  • Si crea una nuova bitmap delle dimensioni volute. Però bisogna anche manipolare quella che credo sia la quantità di pixel necessari alla memorizzazione dei colori e dell'alpha, mediante Bitmap.Config.ARGB_8888.
  • Si ottiene una bitmap dall'immagine in risorse da rendere circolare.
Questa la prima parte, la generazione delle bitmaps.
Poi:
  • Si crea il Canvas avente per parametro la bitmap creata ex novo.
  • Si crea il Paint.
Quindi si disegna il cerchio e l'immagine da rendere tonda
  • Si disegna il cerchio.
  • Si predispongono per la bitmap scelta: XferMode, rettangolo di partenza e rettangolo di destinazione.
  • Si disegna la bitmap mettendo i parametri rettangolo di partenza e destinazione.
Provo a rompere il "Mandala" e rifare tutto da capo...

Okay, direi okay...

sabato 8 aprile 2017

Aggiunta ed eliminazione di una libreria aar da un progetto Android

Importazione di una libreria esterna (aar).
Intanto con New -> New Module ho modificato setting.gradle in questo modo:
include ':app', ':mylibrary-release'


e ho visto apparire il modulo mylibrary-release nella directory principale del mio progetto.

Quindi con New -> Import module, importo il modulo mylibrary che ora mi appare anch'esso nella directory.
Quindi devo risistemare il build.gradle di app aggiungendo l'ultima riga:
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
    compile project(":mylibrary")
}
Ora faccio la verifica: in questa libreria c'è una classe chiamata semplicemente Classe. Vedo se viene riconosciuta.
Ma prima devo sincronizzare Gradle!

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Classe classe=new Classe();
        classe.setNumero(123);
        System.out.println(classe.getNumero());

    }
}
Non ho ottenuto messaggi di errore. Ciò significa che la classe è stata riconosciuta.
Ora eseguo:
04-06 21:19:37.172 11679-11679/? I/System.out: 123


Perfetto!
Ora sarà più difficile togliere questa libreria, perché non so se ricordo bene la procedura...

Sono andato su File -> Project Structure e, andando su app, ho eliminato mylibrary.
Come risultato, build.gradle di app si è modificato con la sparizione della riga che avevo aggiunto a dependencies:
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}
Persiste nel setting.gradle questo:
include ':app', ':mylibrary-release', ':mylibrary'


Nel riquadro a sinistra permangono sia mylibrary sia mylibrary-release.

Torno su Project Structure ed elimino a sinistra sia library sia library-release...

Permangono nel riquadro a sinistra i due moduli, mentre setting.gradle si è modificato così:
include ':app'


Proviamo se il progetto "vuoto" gira normalmente...

Sembra di sì. Sia pure ancora in modo parzialmente empirico, sono riuscito ad eliminare la libreria aggiunta.

mercoledì 5 aprile 2017

Creazione di librerie in Android Studio

Ora provo passo passo a creare una libreria.

File -> New Module -> Android Library
Scelta del nome dell'applicazione e del nome del modulo.

Android Studio elabora...

E' apparsa la cartella mylibrary (nome scelto per il modulo).


Ora devo agire su Gradle.
Apro Settings.Gradle e mi appare questo:
include ':app', ':mylibrary'




Quindi apro build.gradle(Module app).
E mi appare questo:
apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "com.antonello.laboratoriolibrerie"
        minSdkVersion 18
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
}
e vi devo aggiungere la riga:
....

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'

compile project (":mylibrary")
}
e quindi clicco Sync Now sulla barra di Gradle.
Bene, ora ho una libreria senza libri!
Provo ad eseguire...

Non succede nulla, ovviamente.
Ora provo a istanziare una fantomatica classe...
public class MainActivity extends AppCompatActivity {

    Classe classe;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        classe=new Classe();
    }
}
Ottengo messaggi di errore.

Quindi prendo mylibrary - java - com.antonello.mylibrary e ci aggiungo una classe chiamata Classe con il seguente codice:
public class Classe {
    private int numero;
    
    public void setNumero(int n){
        numero=n;
    }
    
    public int getNumero(){
        return numero;
    }
}
Ora torno su MainActivity e riprovo a istanziare la classe Classe:
public class MainActivity extends AppCompatActivity {
    
    Classe classe;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        classe = new Classe();
        classe.setNumero(246);
        System.out.println(classe.getNumero());
    }
}
Non ottengo messaggi di errore.
Eseguo:
04-05 21:59:26.757 9815-9815/? I/System.out: 246



Ecco, dopo vari problemi e distrazioni (mancanza di spazio sull'emulatore, collegamento erroneo del cellulare reale al computer...) alla fine la cosa è riuscita!

sabato 18 febbraio 2017

Esercizio di conversione di indirizzi di memoria in immagini, array di bytes e stringhe.

Ripasso tutte le conversioni di immagini.
  • Uri a Path
  • da Path a Bitmap
  • da Bitmap a byte array (salvabile come blob)
  • da Bitmap a byte array e quindi a stringa (salvabile come stringa e con possibilità di interazione con il database online.

Da Uri a Path:
public class MainActivity extends AppCompatActivity {

    Button button;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        button=(Button)findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setData(Uri.parse("content://media/external/images/media"));
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent,0);

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            System.out.println(UriToPath(data.getData()));


        }
    }

    private String UriToPath(Uri uri){
        Cursor crs=getContentResolver().query(uri,null,null,null,null);
        crs.moveToFirst();
        int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        String s =crs.getString(indice);
        return s;
    }
02-18 23:15:29.203 4670-4670/? I/System.out: /storage/sdcard/DCIM/facciadaculo.jpeg


Da Path a Bitmap:
public class MainActivity extends AppCompatActivity {

    Button button;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        button=(Button)findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setData(Uri.parse("content://media/external/images/media"));
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent,0);

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            String s=UriToPath(data.getData());
            Bitmap b=PathToBitmap(s,300);
            imageView.setImageBitmap(b);


        }
    }

    private String UriToPath(Uri uri){
        Cursor crs=getContentResolver().query(uri,null,null,null,null);
        crs.moveToFirst();
        int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        String s =crs.getString(indice);
        return s;
    }

    private Bitmap PathToBitmap(String path, int dimensioni){
        BitmapFactory.Options opzioni=new BitmapFactory.Options();
        opzioni.inJustDecodeBounds=true;
        BitmapFactory.decodeFile(path);
        int fattore=1;
        while(opzioni.outWidth/fattore>dimensioni && opzioni.outHeight/fattore>dimensioni){
            fattore*=2;
        }
        opzioni.inSampleSize=fattore;
        opzioni.inJustDecodeBounds=false;
        Bitmap bmp=BitmapFactory.decodeFile(path,opzioni);
        return bmp;
    }
}
E funziona anche questa.
Da Bitmap a byte array:
public class MainActivity extends AppCompatActivity {

    Button button;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        button=(Button)findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setData(Uri.parse("content://media/external/images/media"));
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent,0);

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            String s=UriToPath(data.getData());
            Bitmap b=PathToBitmap(s,300);
            byte[] bt=BitmapToByteArray(b);
            System.out.println(bt);


        }
    }

    private String UriToPath(Uri uri){
        Cursor crs=getContentResolver().query(uri,null,null,null,null);
        crs.moveToFirst();
        int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        String s =crs.getString(indice);
        return s;
    }

    private Bitmap PathToBitmap(String path, int dimensioni){
        BitmapFactory.Options opzioni=new BitmapFactory.Options();
        opzioni.inJustDecodeBounds=true;
        BitmapFactory.decodeFile(path);
        int fattore=1;
        while(opzioni.outWidth/fattore>dimensioni && opzioni.outHeight/fattore>dimensioni){
            fattore*=2;
        }
        opzioni.inSampleSize=fattore;
        opzioni.inJustDecodeBounds=false;
        Bitmap bmp=BitmapFactory.decodeFile(path,opzioni);
        return bmp;
    }

    private byte[] BitmapToByteArray(Bitmap bmp){
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG,80,stream);
        byte[] b=stream.toByteArray();
        return b;
    }


}
02-18 23:25:30.707 4855-4855/? I/System.out: [B@1a6afe00

(questa non la capisco... forse si tratta perlopiù di numeri non traducibili in caratteri)
Da bitmap a stringa:
public class MainActivity extends AppCompatActivity {

    Button button;
    ImageView imageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView=(ImageView)findViewById(R.id.imageView);
        button=(Button)findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setData(Uri.parse("content://media/external/images/media"));
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent,0);

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            String s=UriToPath(data.getData());
            Bitmap b=PathToBitmap(s,300);
            String stringa=BitmapToString(b);
            System.out.println(stringa);


        }
    }

    private String UriToPath(Uri uri){
        Cursor crs=getContentResolver().query(uri,null,null,null,null);
        crs.moveToFirst();
        int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        String s =crs.getString(indice);
        return s;
    }

    private Bitmap PathToBitmap(String path, int dimensioni){
        BitmapFactory.Options opzioni=new BitmapFactory.Options();
        opzioni.inJustDecodeBounds=true;
        BitmapFactory.decodeFile(path);
        int fattore=1;
        while(opzioni.outWidth/fattore>dimensioni && opzioni.outHeight/fattore>dimensioni){
            fattore*=2;
        }
        opzioni.inSampleSize=fattore;
        opzioni.inJustDecodeBounds=false;
        Bitmap bmp=BitmapFactory.decodeFile(path,opzioni);
        return bmp;
    }

    private byte[] BitmapToByteArray(Bitmap bmp){
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG,80,stream);
        byte[] b=stream.toByteArray();
        return b;
    }
    private String BitmapToString(Bitmap bmp){
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG,80,stream);
        byte[] b=stream.toByteArray();
        String s= Base64.encodeToString(b,Base64.DEFAULT);
        return s;
    }


}
02-18 23:30:24.629 4970-4970/? I/System.out: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU
02-18 23:30:24.629 4970-4970/? I/System.out: FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo
02-18 23:30:24.629 4970-4970/? I/System.out: KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAFAAUADASIA
02-18 23:30:24.629 4970-4970/? I/System.out: AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
02-18 23:30:24.629 4970-4970/? I/System.out: AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3

.....

...che sarebbe una minima parte della stringa che rappresenterebbe la mia faccia.