获取警报信息并在android 4.0中更改它

时间:2013-02-26 04:50:02

标签: android android-intent android-contentprovider

我正在尝试使用以下代码从内容提供商处检索警报信息

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解释这个技巧

3 个答案:

答案 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()

这将为您提供包含下一个警报的字符串。