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

それは私にエラーパーミッション拒否を与えています クエリからの好奇心旺盛な回答からこのコードをコピーし ました グエンのコメントでアラーム情報を取得します 彼は解決策を指摘しましたとにかく、あなたのヒントに感謝します:) "コードをAndroidソースコードに埋め込み、画像ファイルを実行する方法は?? 説明してください私はいつもEclipseでプロジェクトを作成し、コーディングして実行アプリケーションとして実行します.このトリックを説明してください

4

3 に答える 3

2

私の意見では、各メーカーが独自の時計アプリを実装していたため、Android のデフォルトの AlarmClockApp は各メーカーに応じて置き換えられ、Android OS がメーカーによって変更された場合、コードを正常に実行できません。ですので、この場合、全てのデバイスを扱うことはできないと思います。むしろ、デバイスのメーカーによって処理されるべきです。Samsung デバイスでは、それは 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>

したがって、次の方法で Samsung デバイスのアラームのデータを読み取ることができます。

マニフェストに許可を追加します。

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

それが役に立ち、他のメーカーのコードを受け取ることを願っています.

于 2014-12-23T07:49:13.243 に答える
1

AndroidManifest.xml のコンテンツ プロバイダーの定義を見てください。

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

export は false です。これは、サードパーティ アプリがアクセスできないことを意味します。その結果、許可が拒否されました。

Androidソースコードにコードを埋め込んで画像ファイルを実行する方法

Androidソース(google提供)を改変するということです。あなたの場合には役に立たないと思います。

ルート化されたデバイスで、sqlite データベースの内容を直接変更することで、これを行うことができます。既存のすべての Android プラットフォームで動作するソリューションはないと思います。

一般に、sqlite データベース ファイルは の下/data/data/app-package-name/databases/database-nameにあるため、この例では、/data/data/com.android.deskclock/databases/com.android.deskclock などにする必要があります。SqliteExplorer を使用してファイルを取り出してadb pull開き、必要なものかどうかを確認できます。

この db ファイルを変更する方法については、Using your own SQLite database in Android applications を確認してください。

于 2013-02-26T04:56:50.093 に答える
0

前述のように、ルートなしでこれを行う方法はありませんが、次のアラームがいつ発生し、値が次の値でいつ変化するかを監視できます。

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

これにより、次のアラームの文字列が得られます。

于 2013-04-17T11:13:38.737 に答える