IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android R 设置-显示-屏保,选择“照片桌面”和“相框”,相片选择里面无法搜索到照片 -> 正文阅读

[移动开发]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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:12:20  更:2021-08-07 12:12:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/14 20:03:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码