2016-03-29 15 views
0

デバイスを再起動してもアラームが鳴らないのはなぜですか?私は自分のアラームの時間をSQLiteデータベースに挿入し、デバイスが再起動した後に再びアラームを設定しますが、これはうまくいかないようです。一度にアラームを鳴らすにはどうすればよいですか? mySQLiteHelper.class:デバイスの再起動後にアラームを設定する

public class mySQLiteHelper extends SQLiteOpenHelper { 
    // All Static variables 
    // Database Version 
    public static final int DATABASE_VERSION = 2; 

    // Database Name 
    private static final String DATABASE_NAME = "alarms.db"; 

    // Contacts table name 
    private static final String TABLE_ALARMS = "alarms"; 

    // Contacts Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_ALARM = "alarm"; 
    private static final String KEY_NAME = "name"; 

    public mySQLiteHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables"create table alarms (" 
    //+ "id integer primary key," 
     //  + "alarm text," 
     // + "name text," // added a ',' 
      // + "alarmname text" + ");" 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_ALARMS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_ALARM + " TEXT, " 
       + KEY_NAME + " TEXT" + ")"; 
     //String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_ALARMS + "(" 
      //  + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_ALARM + " TEXT, " 
      //  + KEY_NAME + " TEXT, UNIQUE ("+KEY_NAME+") ON CONFLICT REPLACE" + ")"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * All CRUD(Create, Read, Update, Delete) Operations"," + alarm.getName() +,name 
    */ 

    // Adding new contact 
    void addAlarm(Alarm alarm) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String sql = 
       "INSERT or replace " + 
         "INTO alarms (alarm,"+KEY_NAME+") " + 
         "VALUES("+ alarm.getAlarm() + ",'" + alarm.getName() + "')"; 
     //String sql = 
      //  "INSERT or replace INTO alarms (alarm,alarmname) VALUES("+ alarm.getAlarm() + ",'" + alarm.getName() + "')" ; 
     db.execSQL(sql); 
     db.close(); // Closing database connection 
    } 

    // Getting single contact 
    String getAlarm(String alarmname) { 
     String query = "Select * FROM " + TABLE_ALARMS + " WHERE " + KEY_NAME + " = \"" + alarmname + "\""; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(query, null); 
     if (cursor.getCount()>0) 
      cursor.moveToFirst(); 
     String alarm = cursor.getString(cursor.getColumnIndex(KEY_ALARM)); 
     cursor.close(); 
     // return contact 
     return alarm; 
    } 

    // Deleting single contact 
    public void deleteAlarm() { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     //db.delete(TABLE_ALARMS, KEY_ID + " = ?",Alarm alarm 
      //  new String[] { String.valueOf(alarm.getID()) }); 
     db.execSQL("delete from " + TABLE_ALARMS); 
     db.close(); 
    } 


    // Getting contacts Count 
    public int getAlarmsCount() { 
     String countQuery = "SELECT * FROM " + TABLE_ALARMS; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     int i = cursor.getCount(); 
     cursor.close(); 

     // return count 
     return i; 
    } 
} 

そしてAlarm.class:

public class Alarm { 
    //private variables 
    int _id; 
    String _name; 
    String _alarm; 

    // Empty constructor 
    public Alarm(String alarm,String alarmname){ 
     this._alarm = alarm; 
     this._name = alarmname; 
    } 
    // constructor 
    public Alarm(int id, String name, String alarm){ 
     this._id = id; 
     this._name = name; 
     this._alarm = alarm; 
    } 

    // constructor 
    public Alarm(String alarm){ 
     this._alarm = alarm; 
    } 
    // getting ID 
    public int getID(){ 
     return this._id; 
    } 

    // getting name 
    public String getName(){ 
     return this._name; 
    } 

    // getting phone number 
    public String getAlarm(){ 
     return this._alarm; 
    } 
} 

これは私がaddAlarm()を呼び出す方法です:

Calendar calendar1 = Calendar.getInstance(); 
       calendar1.set(Calendar.MINUTE, timePicker1.getCurrentMinute()); 
       calendar1.set(Calendar.HOUR_OF_DAY,timePicker1.getCurrentHour()); 

       String alarm1 = Long.toString(calendar1.getTimeInMillis()); 
       mySQLiteHelper mySQLiteHelper = new mySQLiteHelper(MainActivity2.this); 
       mySQLiteHelper.deleteAlarm(); 
       mySQLiteHelper.addAlarm(new Alarm(alarm1,"alarm1")); 

とMyReceiver2.classを:

public class MyReceiver2 extends BroadcastReceiver { 
    public MyReceiver2() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){ 
      //context.startService(new Intent(context, MyService.class)); 
      AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
      Intent intent1 = new Intent(context,StartReceiver.class); 
      PendingIntent pi = PendingIntent.getBroadcast(context,0,intent1,0); 
      mySQLiteHelper mySQLiteHelper = new mySQLiteHelper(context); 
      String alarm1 = mySQLiteHelper.getAlarm("alarm1"); 
      long alarm2 = Long.parseLong(alarm1); 
       am.set(AlarmManager.RTC,alarm3,pi); 
     } 
    } 
} 

また、私のAndroidManifエスト

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.amadey.myapplication" > 

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher1" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".Introduction" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".MainActivity" 
     android:theme="@style/AppTheme" > 
    </activity> 
    <activity 
     android:name=".MainActivity2" 
     android:theme="@style/AppTheme" > 
    </activity> 

    <receiver 
     android:name=".StartReceiver" 
     android:enabled="true" 
     android:exported="true" > 
    </receiver> 

    <service 
     android:name=".MyService" 
     android:enabled="true" 
     android:exported="true" > 
    </service> 

    <receiver 
     android:name=".MyReceiver" 
     android:enabled="true" 
     android:exported="true" > 

    </receiver> 

    <service 
     android:name=".MyService2" 
     android:enabled="true" 
     android:exported="true" > 
    </service> 

    <receiver 
     android:name=".MyReceiver2" 
     android:enabled="true" 
     android:exported="true" > 
     <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter> 
    </receiver> 
</application> 

</manifest> 

ありがとうございます。

+0

受取人はまったく働いていますか?マニフェストに 'RECEIVE_BOOT_COMPLETED'権限がありますか? –

+0

あなたのマニフェストファイルを共有してください –

+0

あなたもこれを追加しましたか? –

答えて

0

次のことを行う必要があります。

フォロー許可を追加します。

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

レシーバからコンストラクタを取り除きます。

私がsdカードに保存されている場合は、READ_EXTERNAL_STORAGEの許可を追加する必要がありますか?

sd-cardからデータを読み込みたい場合は、このアクセス許可を指定する必要があります。 SDカードにデータを書きたいだけなら、その必要はありません。その場合はWRITE_EXTERNAL_STORAGEの許可が必要です

0

あなたのデバイスが再起動された場合、マニフェストファイルにBOOT_COMPLETED権限を持たないすべてのサービス/受信者は再起動されません。再起動後に受信者とサービスが「死んでいる」ため、アラームの保留中の意図を聞く者はいません。新しい保留中の意図を送信する人はいません。また、再開時にこれらの保留中の意図もクリアされます。手短に言えば、 は、マニフェストでその権限を使用し、受信者でrestart-intentを処理します。

+0

誰かが私がここで間違って書いたことを私がdownvoteを得たと説明することができます。正しい方向で読み上げることで正しい知識を得たいと思っています。 –

+0

「BOOT_COMPLETED」がブロードキャストアクションである可能性があります。許可は 'RECEIVE_BOOT_COMPLETED'です。または、あなたの答えはこの時点での推測なのかもしれません。 OPがすでにその許可を持っているかどうかはわかりません。いくつかのユーザーは、推測を回答として投稿すると、それを気に入らない人もいます。 –

+0

ああありがとう。私は許可の正しい名前を忘れてしまったようです。 –

関連する問題