JavascriptProva

sabato 15 aprile 2017

Esercizio sulla selezione di contenuti dal ContentProvider e sul ricavare il Path dall'Uri

Vediamo come si risale dall'URI al Path, e quindi prendere l'immagine dal Path.

Bisogna andare su ContentResolver.
Intanto creiamo un "imagepicker".
Uri dovrebbe essere l'indirizzo di una tabella che forse appartiene a qualcosa chiamato ContentProvider.
E vediamo che è 'sto ContentProvider.

Un'idea l'ho avuta: qui c'è solo da imparare a memoria gli URI, salvo creare dei ContentProvider, cosa che è ancora tutta da imparare.
Mi sono scordato TUTTO sull'uso dell'Intent per selezionare una risorsa da un ContentProvider mediante l'URI.
E quante volte mi devo esercitare?
Finora questo, ricostruito faticosamente, mi è riuscito:
public class MainActivity extends AppCompatActivity {

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

        imageView=(ImageView)findViewById(R.id.imageView);
        RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(200,200);
        params.leftMargin=0;
        params.topMargin=200;
        imageView.setLayoutParams(params);
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){

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





    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            System.out.println(data.getData());
        }
    }
}
Ma non è ancora sufficiente.
Ho ottenuto l'URI, ma non il Path.
Ammettiamo che ci sia una tabella con tante colonne, una che sia ID, altre ancora fra cui una che sia il PATH della risorsa.
public class MainActivity extends AppCompatActivity { Bitmap bmp; ImageView imageView; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView=(ImageView)findViewById(R.id.imageView); RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(200,200); params.leftMargin=0; params.topMargin=200; imageView.setLayoutParams(params); button=(Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Intent intent=new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setData(Uri.parse("content://media/external/images/media")); startActivityForResult(intent,0); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ if(resultCode==RESULT_OK){ System.out.println(data.getData()); } } } Per arrivare al PATH dobbiamo entrare nella tabella con il ContentResolver fornendo l'URI, in modo che ci riposizioniamo sul record, quindi dobbiamo trovare la colonna nella quale vi sia il PATH.
Il nome della colonna (ossia del campo) mi resta misterioso. E devo impararlo a memoria.
Ora provo a desumermi il PATH in questo modo.
Innanzitutto devo ottenere sotto forma di Cursor il record corrispondente all'URL:
Cursor crs=getApplicationContext().getContentResolver().query(data.getData(),null,null,null,null);
Quindi trovare il numero della colonna dove è conservato il PATH (che è da imparare a memoria, almeno per il momento, dato che mi sfuggono completamente i criteri):
            crs.moveToFirst();
            int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
E quindi ricavare la stringa presente in quel numero di colonna:
String s=crs.getString(indice);

L'accesso alla risorsa sarà sempre fatto tramite l'Uri.


Ora, partendo da questo scheletro, riscrivere tutto:
public class MainActivity extends AppCompatActivity {

    Bitmap bmp;
    ImageView imageView;
    Button button;
    @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) {

            }
        });
        
    }
}
compresi dimensioni e posizione dell'imageView in fondo a destra.
public class MainActivity extends AppCompatActivity {

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

        imageView=(ImageView)findViewById(R.id.imageView);
        RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(200,200);
        params.leftMargin=200;
        params.topMargin=0;
        imageView.setLayoutParams(params);

        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){

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

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode==RESULT_OK){
            Cursor crs=getApplicationContext().getContentResolver().query(data.getData(),null,null,null,null);
            crs.moveToFirst();
            int indice=crs.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            String s=crs.getString(indice);
            System.out.println(s);
        }
    }
}
Ho corretto la posizione dell'immagine perché avevo usato rightMargin e bottomMargin ma l'immagine mi veniva posizionata in alto a sinistra piuttosto che in basso a destra.
Per il resto è tutto stato scritto correttamente.

Nessun commento:

Posta un commento