下面的代码在L上工作正常,但不适用于M版本。
public void test() {
ContentResolver resolver = getContentResolver();
String[] proj = {
Settings.System.NAME,
Settings.System.VALUE};
String sql = proj[1] + " LIKE 'content%'";
Cursor cursor = resolver.query(Settings.System.CONTENT_URI,
proj,sql,null,null);
while(cursor.moveToNext()) {
String key = cursor.getString(cursor.getColumnIndex(proj[0]));
String value = cursor.getString(cursor.getColumnIndex(proj[1]));
Log.e(TAG,"" + key + "->" + value);
}
cursor.close();
}
在L版本中,输出为:
11595 01-20 11:55:36.322 15833 15833 E MyExam : alarm_alert->content://media/internal/audio/media/11
11596 01-20 11:55:36.322 15833 15833 E MyExam : notification_sound->content://media/internal/audio/media/24
11597 01-20 11:55:36.322 15833 15833 E MyExam : ringtone->content://media/internal/audio/media/36
但是在M版本中,我得到了以下错误:
01-20 11:59:29.962 10141 10141 E AndroidRuntime: FATAL EXCEPTION: main
01-20 11:59:29.962 10141 10141 E AndroidRuntime: Process: com.colibri.gaplessplayer, PID: 10141
01-20 11:59:29.962 10141 10141 E AndroidRuntime: java.lang.IllegalArgumentException: Supported SQL:
01-20 11:59:29.962 10141 10141 E AndroidRuntime: uri content://some_table/some_property with null where and where args
01-20 11:59:29.962 10141 10141 E AndroidRuntime: uri content://some_table with query name=? and single name as arg
01-20 11:59:29.962 10141 10141 E AndroidRuntime: uri content://some_table with query name=some_name and null args
01-20 11:59:29.962 10141 10141 E AndroidRuntime: but got - uri:content://settings/system, where:value LIKE 'content%' whereArgs:null
01-20 11:59:29.962 10141 10141 E AndroidRuntime: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
01-20 11:59:29.962 10141 10141 E AndroidRuntime: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
01-20 11:59:29.962 10141 10141 E AndroidRuntime: at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
01-20 11:59:29.962 10141 10141 E AndroidRuntime: at android.content.ContentResolver.query(ContentResolver.java:491)
01-20 11:59:29.962 10141 10141 E AndroidRuntime: at android.content.ContentResolver.query(ContentResolver.java:434)
如何更改我的代码以适用于L和M?
答案 0 :(得分:1)
正如@ lucky1928所说,它们现在存储在纯XML文件中。 对这些设置的访问应该是相同的,除非现在它们都应该更加安全。
有关于如何存储这些设置(Android M)的说明。
此类是发布系统的内容提供者 设置。它可以通过内容提供商API或通过 自定义调用命令。后者有点快,是首选 访问平台设置的方法。
有三种设置 类型,全局(具有签名级别保护和共享 用户),安全(具有签名权限级别保护和per 用户)和系统(具有危险的权限级别保护和per 用户)。全局设置存储在设备所有者下。每个 这些设置由{@link表示 com.android.providers.settings.SettingsState}对象映射到 从最高有效位中的设置类型派生的整数键 和最低有效位中的用户ID。设置是同步的 加载在SettingsState的实例化和异步 坚持突变。设置存储在用户特定的系统中 目录。
针对API的应用程序Lollipop MR1及更低版本可以添加 自定义设置条目并获得警告。针对更高的API 版本禁止此操作,因为系统设置不适合应用 拯救他们的国家。删除包时,添加的设置 被删除。应用无法删除平台添加的系统设置。 验证系统设置值以确保客户端不放置 坏的价值观。全局和安全设置仅受信任更改 各方,因此不进行验证。还有一个限制 关于可以添加以防止的应用程序特定设置的数量 系统进程内存占用无限增长。
答案 1 :(得分:0)
是的,似乎M设置没有使用数据库,但使用下面的xml文件来存储信息:
/data/system/users/0/settings_global.xml
/data/system/users/0/settings_secure.xml
/data/system/users/0/settings_system.xml
这是否意味着任何数据库查询都会失败?