Problema de ManagedQuery () obsoleto

109

Eu tenho este método:

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);
}

Infelizmente, o compilador me mostrou um problema em:

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

Porque managedQuery()está obsoleto.

Como eu poderia reescrever este método sem uso managedQuery()?

AndreaF
fonte

Respostas:

255

Você pode substituí-lo por context.getContentResolver().querye LoaderManager(você precisará usar o pacote de compatibilidade para oferecer suporte a dispositivos anteriores à versão 11 da API).

No entanto, parece que você está usando a consulta apenas uma vez: provavelmente você nem precisa disso. Talvez isso funcionasse?

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;
}
Femi
fonte
ops ... não não funciona em nenhum caso ... se o uri começar com "file: //" não retorna o caminho certo
AndreaF
file://URIs geralmente não podem ser resolvidos usando contentUri: se você tem um URI de arquivo, você JÁ tem o caminho real.
Femi,
Você poderia me dar mais detalhes? Eu tenho um "Uri", meu problema é obter o caminho absoluto real sem file: //, / content: / e outros atributos.
AndreaF,
1
Para um URI de conteúdo, você precisará de um resolvedor para obter um URI de arquivo e, assim que tiver um URI de arquivo, basta fazer new File(new URI(uri.getPath()));.
Femi
1
Ah, claro: new File(new URI(uri.getPath())).getAbsolutePath();é o que você precisa, não?
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();
            }
        }
    }
PrvN
fonte
-6

você precisa inicializar o cursor porque ele estará fechado antes do método iniciar ou em algum outro lugar

cursor = null;
public void method(){
// do your stuff here 
cursor.close();
}
Buggy IdioT
fonte
8
Initialize cursor ajuda com método obsoleto, realmente?
IlyaEremin