Problema ManagedQuery () obsoleto


109

Ho questo metodo:

public String getRealPathFromURI(Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(contentUri, proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

Purtroppo il compilatore mi mostra un problema su:

Cursor cursor = managedQuery(contentUri, proj, null, null, null);

Perché managedQuery()è deprecato.

Come potrei riscrivere questo metodo senza utilizzarlo managedQuery()?

Risposte:


255

Potresti sostituirlo con context.getContentResolver().querye LoaderManager(dovrai usare il pacchetto di compatibilità per supportare i dispositivi prima della versione 11 dell'API).

Tuttavia, sembra che tu stia utilizzando la query solo una volta: probabilmente non ne hai nemmeno bisogno. Forse questo funzionerebbe?

public String getRealPathFromURI(Uri contentUri) {
    String res = null;
    String[] proj = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
    if(cursor.moveToFirst()){;
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
       res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
}

ops ... no non funziona comunque ... se l'uri inizia con "file: //" non restituisce il percorso corretto
AndreaF

file://Gli URI generalmente non possono essere risolti usando contentUri: se hai un URI di file, hai GIÀ il percorso reale.
Femi

Potresti fornirmi maggiori dettagli? Ho un "Uri", il mio problema è ottenere il percorso assoluto reale senza file: //, / content: / e altri attributi.
AndreaF

1
Per un URI di contenuto, avrai bisogno di un resolver per ottenere un URI di file, e una volta che hai un URI di file puoi semplicemente farlo new File(new URI(uri.getPath()));.
Femi

1
Ah, certo: new File(new URI(uri.getPath())).getAbsolutePath();è quello che ti serve, no?
Femi

3
public void getBrowserHist(Context context) {
        Cursor mCur = context.getContentResolver().query(Browser.BOOKMARKS_URI,
                Browser.HISTORY_PROJECTION, null, null, null);
        mCur.moveToFirst();
        if (mCur != null && mCur.moveToFirst() && mCur.getCount() > 0) {
            while (mCur.isAfterLast() == false) {
                Log.e("hist_titleIdx",
                        mCur.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
                Log.e("hist_urlIdx",
                        mCur.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
                mCur.moveToNext();
            }
        }
    }

-6

è necessario inizializzare il cursore perché sarà chiuso prima dell'inizio del metodo o altrove

cursor = null;
public void method(){
// do your stuff here 
cursor.close();
}

8
Inizializza il cursore aiuta con il metodo deprecato, davvero?
IlyaEremin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.