0

私のアプリケーションでは、アラームを作成します。そのため、電話を再起動したときに、アラームを再度作成する必要があります。

しかし、電話(エミュレーター)を再起動し、アラームを作成する必要がある場合は、強制終了があります。それは言う:

Unable to instantiate receiver com.yannv.vehiclesmanager.AlarmReceiver: 
java.lang.ClassNotFoundException: com.yannv.vehiclesmanager.AlarmReceiver in loader
dalvik.system.PathClassLoader[/data/app/com..etc]

これが私のマニフェストの懸念される部分です(問題がそこから来ているかどうかはわかりません。)

    <receiver android:name="AlarmReceiver">
        <intent-filter>
            <action
                android:name="afficherNotification" />
            <data
                android:scheme="rappel" />
        </intent-filter>
    </receiver>

    <receiver android:name="com.yannv.vehiclesmanager.BootReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

</application>

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

ご協力いただきありがとうございます

BootReceiverクラス:

package com.yannv.vehiclesmanager;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;

public class BootReceiver extends BroadcastReceiver{

/*Lorsqu'on éteint le téléphone, les alarmes sont supprimées. Cette méthode est appelée
au démarrage du téléphone et sert à recréer les alarmes*/

public void onReceive(Context context, Intent in) {

    final int NOT_AUCUN = 0;            //ID des possibilités de notification
    final int NOT_AU_DEBUT = 1;
    final int NOT_10_MINUTES = 2;
    final int NOT_30_MINUTES = 3;
    final int NOT_1_HEURE = 4;
    final int NOT_2_HEURES = 5;
    final int NOT_3_HEURES = 6;
    final int NOT_12_HEURES = 7;
    final int NOT_24_HEURES = 8;
    final int NOT_2_JOURS = 9;
    final int NOT_1_SEMAINE = 10;

    final int ID_COLUMN_ID = 0;
    final int ID_COLUMN_DATE = 2;
    final int ID_COLUMN_HEURE = 4;
    final int ID_COLUMN_NOTIF = 7;

    int heures;
    int minutes;
    int annee;
    int mois;
    int jour;

    Intent intent = new Intent(context, AlarmReceiver.class);

    Date dateRappel = null;
    Date dateNotif;
    final SimpleDateFormat dateFormatDB = new SimpleDateFormat ("yyyy'.'MM'.'dd");

    DBAdapter db;

    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    db = new DBAdapter(context);
    db.open();

    Cursor c = db.recupListeRappelAVenir();
    c.moveToFirst();

    for(int i=0;i<c.getCount();i++){
        try {
                dateRappel = dateFormatDB.parse(c.getString(ID_COLUMN_DATE).toString());
            } catch (ParseException e) {
                e.printStackTrace();
            }

            String[] heureRappel = c.getString(ID_COLUMN_HEURE).toString().split(":");
            heures = (int) Integer.parseInt(heureRappel[0]);
            minutes = (int) Integer.parseInt(heureRappel[1]);
            annee = dateRappel.getYear();
            mois = dateRappel.getMonth();
            jour = dateRappel.getDay();

            dateNotif = null;
            dateNotif = new Date (annee, mois, jour, heures, minutes);

            PendingIntent sender = PendingIntent.getBroadcast(context, c.getInt(ID_COLUMN_ID), intent, 0);

            switch(c.getInt(ID_COLUMN_NOTIF)){
            case NOT_AUCUN :
                //Pas de notification
                dateNotif = null;
                break;
            case NOT_AU_DEBUT :
                //On ne fait rien
                break;
            case NOT_10_MINUTES :
                dateNotif.setTime(dateNotif.getTime()- 600000);
                break;
            case NOT_30_MINUTES :
                dateNotif.setTime(dateNotif.getTime()- 1800000);
                break;
            case NOT_1_HEURE : 
                dateNotif.setTime(dateNotif.getTime()- 3600000);
                break;
            case NOT_2_HEURES : 
                dateNotif.setTime(dateNotif.getTime()- 7200000);
                break;
            case NOT_3_HEURES : 
                dateNotif.setTime(dateNotif.getTime()- 10800000);
                break;
            case NOT_12_HEURES : 
                dateNotif.setTime(dateNotif.getTime()- 43200000);
                break;
            case NOT_24_HEURES : 
                dateNotif.setTime(dateNotif.getTime()- 86400000);
                break;
            case NOT_2_JOURS : 
                dateNotif.setTime(dateNotif.getTime() - 172800000);
                break;
            case NOT_1_SEMAINE : 
                dateNotif.setTime(dateNotif.getTime() - 604800000);
                break;
            }

            if (dateNotif != null){
                am.set(AlarmManager.RTC_WAKEUP, dateNotif.getTime(), sender);
            }

            c.moveToNext();
        }

        c.close();
        db.close();

}

}

AlarmReceiverクラス

package com.yannv.vehiclesmanager;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    try {
        //Création de la notification
        NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        int icon = R.drawable.icon;
        CharSequence tickerText = "Notification de Vehicles Manager";
        long when = System.currentTimeMillis();
        CharSequence contentTitle = "Vehicles Manager : rappel !";
        CharSequence contentText = "Pressez pour voir la liste des rappels";

        Intent notificationIntent = new Intent(context, Rappel.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

        Notification notification = new Notification(icon, tickerText, when);
        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        nm.notify(0, notification);

    } catch (Exception exception) {
        Toast.makeText(context, "Vehicle's Manager : erreur lors du lancement d'une notification", Toast.LENGTH_LONG).show();
        Log.e("ALARM_RECEIVER", exception.toString());
    }

}

}

編集:問題は解決しました。私の問題はすべて、BootReceiverクラスの次の行から発生したようです。

jour = dateRappel.getDay();

に置き換えます

jour = dateRappel.getDate();

そしてそれは動作します。

4

2 に答える 2

0

AlarmReceiver に完全修飾名を付ける

<receiver android:name="com.yannv.vehiclesmanager.AlarmReceiver">
    <intent-filter>
        <action
            android:name="afficherNotification" />
        <data
            android:scheme="rappel" />
    </intent-filter>
</receiver>

AlarmReceiver クラスのパッケージ名を確認してください。これだけのはずです。

package com.yannv.vehiclesmanager;
于 2011-09-07T10:00:24.643 に答える