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};
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
|