【问题标题】:Deprecated ManagedQuery() issue已弃用的 ManagedQuery() 问题
【发布时间】:2026-02-19 05:15:02
【问题描述】:

我有这个方法:

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(),我怎么能重写这个方法?

【问题讨论】:

    标签: java android deprecated


    【解决方案1】:

    您可以将其替换为context.getContentResolver().queryLoaderManager(您需要使用兼容性包来支持 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;
    }
    

    【讨论】:

    • ops...no 在任何情况下都不起作用...如果 uri 以“file://”开头不会返回正确的路径
    • file:// URI 通常无法使用 contentUri 解析:如果您有文件 URI,则您已经拥有真实路径。
    • 你能给我更多的细节吗?我有一个“Uri”,我的问题是获取没有 file://、/content:/ 和其他属性的真正绝对路径。
    • 对于内容 URI,您需要一个解析器来获取文件 URI,一旦您有了文件 URI,您就可以使用 new File(new URI(uri.getPath()));
    • 啊,当然:new File(new URI(uri.getPath())).getAbsolutePath(); 是你需要的,不是吗?
    【解决方案2】:
    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();
                }
            }
        }
    

    【讨论】:

      【解决方案3】:

      你需要初始化光标,因为它会在方法开始之前或其他地方关闭

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

      【讨论】:

      • 初始化游标有助于弃用方法,真的吗?
      最近更新 更多