计算 Android 平板电脑上的所有图片

Count All Pictures on Android Tablet

我正在尝试以编程方式获取 Android 平板电脑图库中的图像(视频和图片)数量。如果重要的话,它是SM-T580。我能够让它与 android 手机一起使用,但无法让它与平板电脑一起使用。它必须抛出一个异常,因为应用程序崩溃了,但它没有提供任何有意义的信息,即使我在堆栈跟踪时也是如此。我不确定这里发生了什么。我将包括我的代码,该代码可在手机上运行,​​但在平板电脑上会爆炸。非常感谢任何帮助。

获取图库中所有图片的方法:

public int findAnyPictures(){
    int count = 0;
    final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
    final String orderBy = MediaStore.Images.Media._ID;
    //Stores all the images from the gallery in Cursor
    Cursor cursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
            null, orderBy);
    //Total number of images
    if (cursor != null){
        count = cursor.getCount();
    }
    cursor.close();
    return count;
}

这里是统计所有视频的方法

 public int findAnyVideos() {
        int vidsCount = 0;
        Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        String[] projection = { MediaStore.Video.VideoColumns.DATA };
        Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null) {
            vidsCount = cursor.getCount();
            cursor.close();
        }
        return vidsCount;
    }

调用find any pictures时似乎抛出运行时异常,我不确定为什么它告诉我我没有适当的权限。我已经在 android 清单中包含了它提到的权限,但我不知道 grantUriPermission() 是什么?这是堆栈跟踪

java.lang.RuntimeException: 无法启动 activity ComponentInfo{com.example.thopfer.resetverify/com.example.thopfer.resetverify.MainActivity}: java.lang.SecurityException: 权限被拒绝:读取com.android.providers.media.MediaProvider uri 内容://media/external/images/media 来自 pid=22228,uid=10126 需要 android.permission.READ_EXTERNAL_STORAGE,或 grantUriPermission() 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3305) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3401) 在 android.app.ActivityThread.access1100 美元(ActivityThread.java:229) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:7303) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=22228, uid=10126 requires android.permission.READ_EXTERNAL_STORAGE, 或者grantUriPermission() 在 android.os.Parcel.readException(Parcel.java:1620) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183) 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 在 android.content.ContentProviderProxy.query(ContentProviderNative.java:421) 在 android.content.ContentResolver.query(ContentResolver.java:502) 在 android.content.ContentResolver.query(ContentResolver.java:445) 在 com.example.thopfer.resetverify.MainActivity.findAnyPictures(MainActivity.java:234) 在 com.example.thopfer.resetverify.MainActivity.onCreate(MainActivity.java:185) 在 android.app.Activity.performCreate(Activity.java:6904) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3252) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3401) 在 android.app.ActivityThread.access1100 美元(ActivityThread.java:229) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:7303) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

好吧,这告诉你问题所在

requires android.permission.READ_EXTERNAL_STORAGE

您必须在运行时为 Android API 23+ (Android 6.0+) 请求权限。更多相关信息:https://developer.android.com/training/permissions/requesting.html

if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
        REQUEST_CODE);
}

您将在 onRequestPermissionsResult 中得到答案。