• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

failed to get cursor when querying URI table for a PDF file in the Downloads folder of an Android 11


Android Enthusiast
  • Dec 8, 2014
    On a Android 11 device, through SAF(Storage Access Framework) system file picker, my app picks a PDF file which locates in the public folder Downloads.

    In order to get its full path, I try to query the uri table through context.getContentResolver().query().

    But now, the cursor returned is not null while cursor.moveToFirst() == false. As a result, my app failed to get the full path.
    What's wrong?

    My Android device: Android 11, Mi 12 Pro. The READ_EXTERNAL_STORAGE and MANAGE_EXTERNAL_STORAGE are all in manifest.

    code snippet a-

    //now, uri = "content://com.android.providers.downloads.documents/document/msf%3A7755"

    final String id = DocumentsContract.getDocumentId(uri); //now, id = msf:7755
    final String[] split = id.split(":");
    final String type = split[0]; //now, type="msf"
    String strRealId = split[1]; //now, strRealId = 7755

    final Uri contentUri;

    contentUri =ContentUris.withAppendedId(MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL),
    //contentUri =ContentUris.withAppendedId(MediaStore.Downloads.EXTERNAL_CONTENT_URI,

    //now, contentUri = "content://media/external/downloads/7755"

    path = getDataColumn(context, contentUri, null, null);

    code snippet b -

    private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
    Cursor cursor = null;
    final String column = "_data";
    final String column2 = "_id";
    final String[] projection = {column,column2};
    try {
    cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);

    //The row as below. step debug to here. I found cursor != null while cursor.moveToFirst() == false! What's wrong?
    if (cursor != null && cursor.moveToFirst()) {

    final int column_index = cursor.getColumnIndexOrThrow(column);

    String strTest = "";
    int nTest = 0;

    strTest = cursor.getString(column_index);
    nTest = cursor.getInt(1);

    return strTest;
    } catch(Exception e)
    String strError = e.getMessage();
    finally {
    if (cursor != null)
    return null;
    Last edited:

    BEST TECH IN 2023

    We've been tracking upcoming products and ranking the best tech since 2007. Thanks for trusting our opinion: we get rewarded through affiliate links that earn us a commission and we invite you to learn more about us.