我试图用下面的代码来从内容提供商报警信息
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());
}
}
它给我的错误权限拒绝我复制从好奇回答这个代码查询获取报警信息来源在阮的评论,他指出一个解决方案:“如果我嵌入Android源代码和运行的图像文件的代码,它可以通过拒绝‘权限’错误和检索报警信息。无论如何,感谢你的小费:)“如何嵌入在Android源代码和运行图像文件的代码? 请解释我总是在Eclipse中创建一个项目,然后和运行代码的运行application.please解释这个把戏
看看在AndroidManifest.xml中的内容提供者的定义
<provider android:name="AlarmProvider"
android:authorities="com.android.deskclock"
android:exported="false" />
导出的是假的,这意味着第三方应用程序不能访问它。 拒绝权限的结果。
如何嵌入在Android源代码代码并运行图像文件
这意味着你修改的Android源(由谷歌提供)。 我不认为这是你的情况是有用的。
你可以做,在一个扎根装置,通过直接修改SQLite数据库的内容。 我不认为这是对所有现有的Android平台上运行的解决方案。
在一般情况下,SQLite数据库文件是在/data/data/app-package-name/databases/database-name
,所以在这个例子中,它应该是/data/data/com.android.deskclock/databases/com.android。 DeskClock中或类似的东西。 您可以通过拉出该文件adb pull
,并使用SqliteExplorer来检查它是否是你想要打开它。
对于如何修改这个数据库文件,请在Android应用程序中使用自己的SQLite数据库
在我看来,由于各厂家的执行了自己的时钟应用程式,所以Android默认的AlarmClockApp将被取代取决于每个制造商,使您的代码无法运行成功,如果Android操作系统已经被制造商修改。 所以我认为我们不能处理所有的设备在这种情况下,取而代之的是,我们应该通过设备制造商处理程序吧。 与三星的设备,它的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");
用途是:
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());
}
}
希望这是有益的和收到的代码为别人生产。
至于说有没有办法做到这一点没有根,但在接下来的报警,你可以监视在与下面的值值的变化:
Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED).toString()
这会给你的下一个报警的字符串。