我正在尝试使用以下代码从内容提供商处检索警报信息
final String tag_alarm = "tag_alarm";
Uri uri = Uri.parse("content://com.android.deskclock/alarm")
Cursor c = getContentResolver().query(uri, null, null, null, null);
Log.i(tag_alarm, "no of records are" + c.getCount());
Log.i(tag_alarm, "no of columns are" + c.getColumnCount());
if (c != null) {
String names[] = c.getColumnNames();
for (String temp : names) {
System.out.println(temp);
}
if (c.moveToFirst()) {
do {
for (int j = 0; j < c.getColumnCount(); j++) {
Log.i(tag_alarm, c.getColumnName(j);
+ " which has value " + c.getString(j));
}
} while (c.moveToNext());
}
}
它给了我错误权限拒绝我从查询Get alarm infomation的好奇回答中复制了这段代码 在Nguyen的评论中,他指出了一个解决方案“如果我在Android源代码中嵌入此代码并运行图像文件,它可以通过”权限被拒绝“错误并检索警报信息。无论如何,谢谢你的提示:)”如何嵌入代码android源代码和运行图像文件??请解释我总是在eclipse中创建一个项目然后编写并运行它作为运行application.please解释这个技巧
答案 0 :(得分:1)
查看AndroidManifest.xml中内容提供程序的定义
<provider android:name="AlarmProvider"
android:authorities="com.android.deskclock"
android:exported="false" />
导出为false,表示第三方应用无法访问它。因此拒绝许可。
如何在Android源代码中嵌入代码并运行图像文件
这意味着您修改了Android源代码(由谷歌提供)。我不认为它对你的情况有用。
您可以在root用户设备中直接修改sqlite数据库中的内容。我不认为有一个解决方案可以在所有现有的Android平台上运行。
通常,sqlite数据库文件位于/data/data/app-package-name/databases/database-name
下,因此在此示例中,它应为/data/data/com.android.deskclock/databases/com.android.deskclock或类似内容。您可以通过adb pull
拉出文件并使用SqliteExplorer打开它以检查它是否是您想要的。
有关如何修改此db文件,请选中Using your own SQLite database in Android applications
答案 1 :(得分:1)
在我看来,因为每个制造商都实施了自己的时钟应用程序, 因此Android的默认AlarmClockApp将取决于每个制造商,如果Android Os已被制造商修改,则会使您的代码无法成功运行。 所以我认为在这种情况下我们无法处理所有设备,而不是那样,我们应该由设备制造商处理它。 使用三星设备,它是ClockPackage和androidManifest:
<provider
android:name=".alarm.AlarmProvider"
android:authorities="com.samsung.sec.android.clockpackage"
android:exported="true"
android:readPermission="com.sec.android.app.clockpackage.permission.READ_ALARM"
android:writePermission="com.sec.android.app.clockpackage.permission.WRITE_ALARM" >
</provider>
因此我们可以通过以下方式读取三星设备中的报警数据:
在清单中添加权限:
<uses-permission android:name="com.sec.android.app.clockpackage.permission.READ_ALARM" />
然后通过以下方式获取Uri:
Uri uri = Uri.parse("content://com.samsung.sec.android.clockpackage/alarm");
使用Uri:
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c == null) { // that mean devices is not belong to Samsung manufacturer,
// we should use an other uri (don't for get to add permission)
AlarmLog.w("Can not read cursor");
}
AlarmLog.i(tag_alarm, "no of records are " + c.getCount());
AlarmLog.i(tag_alarm, "no of columns are " + c.getColumnCount());
if (c != null) {
String names[] = c.getColumnNames();
for (String temp : names) {
AlarmLog.d(tag_alarm, temp);
}
if (c.moveToFirst()) {
do {
for (int j = 0; j < c.getColumnCount(); j++) {
AlarmLog.i(tag_alarm, c.getColumnName(j)
+ " which has value " + c.getString(j));
}
} while (c.moveToNext());
}
}
希望它有用并接收其他制造商的代码。
答案 2 :(得分:0)
如上所述,没有root就没有办法做到这一点,但你可以监控下一个警报的时间以及当值随着以下值变化时:
Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED).toString()
这将为您提供包含下一个警报的字符串。