0

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

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

它给了我错误权限拒绝我从查询的好奇答案中复制了这段代码在 Nguyen 的评论中获取警报信息 他指出了一个解决方案“如果我将此代码嵌入 Android 源代码并运行图像文件,它可以传递“权限被拒绝”错误并检索警报信息。无论如何,谢谢你的提示:)“如何在android源代码中嵌入代码并运行图像文件??请解释一下,我总是在 Eclipse 中创建一个项目,然后编写代码并将其作为运行应用程序运行。请解释一下这个技巧

4

3 回答 3

2

在我看来,由于每个厂商都实现了自己的Clock App,所以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());
        }
    }

希望它对其他制造商有所帮助并接收代码。

于 2014-12-23T07:49:13.243 回答
1

查看AndroidManifest.xml中内容提供者的定义

<provider android:name="AlarmProvider"
                android:authorities="com.android.deskclock"
                android:exported="false" />

导出的是 false,这意味着 3rd-party 应用程序无法访问它。结果拒绝许可。

如何在android源代码中嵌入代码并运行图像文件

这意味着您修改了Android源(由google提供)。我认为这对您的情况没有用。

您可以通过直接修改 sqlite 数据库中的内容在有根设备中执行此操作。我认为没有适用于所有现有 Android 平台的解决方案。

一般情况下,sqlite 数据库文件都在 下/data/data/app-package-name/databases/database-name,所以在这个例子中,它应该是 /data/data/com.android.deskclock/databases/com.android.deskclock 或类似的东西。您可以将文件拉出adb pull并使用 SqliteExplorer 打开它以检查它是否是您想要的。

有关如何修改此 db 文件,请查看在 Android 应用程序中使用您自己的 SQLite 数据库

于 2013-02-26T04:56:50.093 回答
0

如前所述,没有root就无法做到这一点,但是您可以监视下一个警报何时以及该值何时随以下值发生变化:

Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED).toString()

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

于 2013-04-17T11:13:38.737 回答