Problème de ManagedQuery () obsolète

109

J'ai cette méthode:

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

Malheureusement, le compilateur m'a montré un problème sur:

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

Parce que managedQuery()c'est obsolète.

Comment pourrais-je réécrire cette méthode sans utilisation managedQuery()?

AndreaF
la source

Réponses:

255

Vous pouvez le remplacer par context.getContentResolver().queryet LoaderManager(vous devrez utiliser le package de compatibilité pour prendre en charge les appareils antérieurs à la version 11 de l'API).

Cependant, il semble que vous n'utilisiez la requête qu'une seule fois: vous n'en avez probablement même pas besoin. Peut-être que cela fonctionnerait?

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
la source
ops ... no ne fonctionne en aucun cas ... si l'URI commence par "file: //" ne renvoie pas le bon chemin
AndreaF
file://Les URI ne peuvent généralement pas être résolus en utilisant contentUri: si vous avez un URI de fichier, vous avez DÉJÀ le chemin réel.
Femi
Pouvez-vous me donner plus de détails? J'ai un "Uri", mon problème est d'obtenir le vrai chemin absolu sans file: //, / content: / et autres attributs.
AndreaF
1
Pour un URI de contenu, vous aurez besoin d'un résolveur pour obtenir un URI de fichier, et une fois que vous avez un URI de fichier, vous pouvez le faire new File(new URI(uri.getPath()));.
Femi
1
Ah, bien sûr: new File(new URI(uri.getPath())).getAbsolutePath();c'est ce dont vous avez besoin, non?
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
la source
-6

vous devez initialiser le curseur car il sera fermé avant le début de la méthode ou ailleurs

cursor = null;
public void method(){
// do your stuff here 
cursor.close();
}
IdioT de buggy
la source
8
Initialiser le curseur aide avec la méthode obsolète, vraiment?
IlyaEremin