Android R 设置-显示-屏保,选择“照片桌面”和“相框”,相片选择里面无法搜索到照片

1.adb 分析所在界面对应的应用:adb shell dumpsys activity | grep “mFoc”

  mFocusedApp=ActivityRecord{915f9af u0 com.android.dreams.phototable/.PhotoTableDreamSettings t56}
    mFocusedWindow=Window{1260b5a u0 com.android.dreams.phototable/com.android.dreams.phototable.PhotoTableDreamSettings}

说明进程包名为:com.android.dreams.phototable
2.根据包名查看代码位置路径:adb shell pm list packages -f |grep com.android.dreams.phototable

package:/product/app/PhotoTable/PhotoTable.apk=com.android.dreams.phototable

3.通过Android Studio 打开所在目录
数据库搜索操作在目录:packages/screensavers/PhotoTable/src/com/android/dreams/phototable/LocalSource.java中findAlbums和findImages方法中

    public void findAlbums(boolean internal, HashMap<String, AlbumData> foundAlbums) {
        Uri uri = internal ? MediaStore.Images.Media.INTERNAL_CONTENT_URI
            : MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_ID,
                MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATE_TAKEN};
        // This is a horrible hack that closes the where clause and injects a grouping clause.
        Cursor cursor = mResolver.query(uri, projection, null, null, null);
        if (cursor != null) {
            cursor.moveToPosition(-1);

            int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
            int bucketIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID);
            int nameIndex = cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME);
            int updatedIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN);

            if (bucketIndex < 0) {
                log(TAG, "can't find the ID column!");
            } else {
                while (cursor.moveToNext()) {
                    String id = constructId(internal, cursor.getString(bucketIndex));
                    AlbumData data = foundAlbums.get(id);
                    if (foundAlbums.get(id) == null) {
                        data = new AlbumData();
                        data.id = id;
                        data.account = mLocalSourceName;

                        if (dataIndex >= 0) {
                            data.thumbnailUrl = cursor.getString(dataIndex);
                        }

                        if (nameIndex >= 0) {
                            data.title = cursor.getString(nameIndex);
                        } else {
                            data.title = mUnknownAlbumName;
                        }

                        log(TAG, data.title + " found");
                        foundAlbums.put(id, data);
                    }
                    if (updatedIndex >= 0) {
                        long updated = cursor.getLong(updatedIndex);
                        data.updated = (data.updated == 0 ?
                                        updated :
                                        Math.min(data.updated, updated));
                    }
                }
            }
            cursor.close();
        }
    }
    protected void findImages(boolean internal, int howMany, LinkedList<ImageData> foundImages ) {
        Uri uri = internal ? MediaStore.Images.Media.INTERNAL_CONTENT_URI
            : MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION,
                MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
        String selection = "";
        for (String id : getFoundAlbums()) {
            if (isInternalId(id) == internal && mSettings.isAlbumEnabled(id)) {
                String[] parts = id.split(":");
                if (parts.length > 1) {
                    if (selection.length() > 0) {
                        selection += " OR ";
                    }
                    selection += MediaStore.Images.Media.BUCKET_ID + " = '" + parts[1] + "'";
                }
            }
        }
        if (selection.isEmpty()) {
            return;
        }
        Cursor cursor = mResolver.query(uri, projection, selection, null, null);
        if (cursor != null) {
            int dataIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);

            if (cursor.getCount() > howMany && mLastPosition == INVALID) {
                mLastPosition = pickRandomStart(cursor.getCount(), howMany);
            }
            cursor.moveToPosition(mLastPosition);

            if (dataIndex < 0) {
                log(TAG, "can't find the DATA column!");
            } else {
                while (foundImages.size() < howMany && cursor.moveToNext()) {
                    ImageData data = unpackImageData(cursor, null);
                    data.uri = uri;
                    foundImages.offer(data);
                    mLastPosition = cursor.getPosition();
                }
                if (cursor.isAfterLast()) {
                    mLastPosition = -1;
                }
                if (cursor.isBeforeFirst()) {
                    mLastPosition = INVALID;
                }
            }

            cursor.close();
        }
    }

查看相关log,发现数据库cursor不为空,但cursor.moveToNext为false。说明查询的数据库没有数值。
问题分析方向:
1.数据库确实没有数值,但是查询图库应用,确实有图片显示,且用adb 查看数据库位置:
adb root
adb remount
adb shell
cd /data/data/com.android.providers.media.module/databases

data/data/com.android.providers.media.module/databases # ls
external.db  external.db-shm  external.db-wal  internal.db  internal.db-shm  internal.db-wal

发现确实有相关数据,可以排除该方向
2.没有查询数据库的权限:观察配置文件,读取媒体库需要android.permission.READ_EXTERNAL_STORAGE
在设置-应用-查看全部应用-显示系统程序-照片屏幕保护程序中查看权限
发现确实没有授予文件和媒体权限
在这里插入图片描述手动打开权限后,在进入屏保界面,打开照片桌面,右上角选择照片,发现照片数据已经显示出来,功能正常。因此可以确实是应用没有默认文件和媒体权限引起的数据异常。
解决:
1.可以代码手动动态授予文件和媒体权限。此思路上层应用很常见。

        if (Build.VERSION.SDK_INT >= 23) {
            int checkPermission = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
            if (checkPermission != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
            }
        }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 1: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    init();
                } else {
                    Intent intent = new Intent();
                    intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                    intent.setData(Uri.fromParts("package", getPackageName(), null));
                    startActivity(intent);
                    finish();
                }
            }
        }
    }

在动态授予权限时,注意在权限弹窗时显示时,点击拒绝后,连续两次拒绝后,第三次不显示弹窗,所以做了跳转到应用-权限位置,手动授予权限。

2.系统默认预授权动态权限。此方法有可能造成CTS风险
规则是在在代码pms里做预授权。此思路没有实践,可查看链接
https://www.jianshu.com/p/b3bacf23e181
https://blog.csdn.net/sinat_20059415/article/details/80369872

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值