Устарела проблема с ManagedQuery ()

109

У меня есть такой способ:

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

К сожалению, компилятор показал мне проблему:

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

Потому managedQuery()что устарело.

Как я мог переписать этот метод без использования managedQuery()?

АндреаФ
источник

Ответы:

255

Вы можете заменить его на context.getContentResolver().queryи LoaderManager(вам нужно будет использовать пакет совместимости для поддержки устройств до версии API 11).

Однако похоже, что вы используете запрос только один раз: вероятно, вам это даже не нужно. Может, это сработает?

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
источник
ops ... no не работает в любом случае ... если uri начинается с "file: //" не возвращает правильный путь
AndreaF
file://URI обычно не могут быть разрешены с помощью contentUri: если у вас есть URI файла, у вас УЖЕ есть реальный путь.
Femi,
Не могли бы вы дать мне более подробную информацию? У меня есть «Uri», моя проблема в том, чтобы получить реальный абсолютный путь без атрибутов file: //, / content: / и других.
AndreaF 03
1
Для URI контента вам понадобится преобразователь, чтобы получить URI файла, и когда у вас есть URI файла, вы можете просто сделать это new File(new URI(uri.getPath()));.
Femi,
1
Ах, конечно: new File(new URI(uri.getPath())).getAbsolutePath();это то, что тебе нужно, не так ли?
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
источник
-6

вам нужно инициализировать курсор, потому что он будет закрыт до запуска метода или где-то еще

cursor = null;
public void method(){
// do your stuff here 
cursor.close();
}
Багги IdioT
источник
8
Инициализация курсора помогает с устаревшим методом, правда?
Илья Еремин