java - 广播接收器使某些设备中的应用程序崩溃

标签 java android android-intent broadcastreceiver alarmmanager

我有一个 Android 应用程序,我正在其中使用广播接收器和警报管理器设置一些任务。这是一个非常简单的应用程序,例如提醒,用户创建提醒,系统将通过 toast 和蜂鸣声唤醒用户。

在我的 Activity 中,我按如下方式设置任务:

Bundle bundle = new Bundle();
MyAlarm alarm = new MyAlarm(MainActivity.this, bundle, sec);    

我的闹钟类如下:

public class MyAlarm extends BroadcastReceiver {
private final String REMINDER_BUNDLE = "MyReminderBundle"; 
public MyAlarm(){ }

public MyAlarm(Context context, Bundle extras, int timeoutInSeconds){
     AlarmManager alarmMgr = 
         (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent intent = new Intent(context, MyAlarm.class);
             intent.putExtra(REMINDER_BUNDLE, extras);
     PendingIntent pendingIntent =
         PendingIntent.getBroadcast(context, 0, intent, 
         PendingIntent.FLAG_UPDATE_CURRENT);
     Calendar time = Calendar.getInstance();
     time.setTimeInMillis(System.currentTimeMillis());
     time.add(Calendar.SECOND, timeoutInSeconds);
     alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                  pendingIntent);
 }

 public void onReceive(Context context, Intent intent) {
 Toast.makeText(context, "Received", Toast.LENGTH_LONG).show();
 try{
    playSound(context);
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
}

我的播放声音代码如下:

public void playSound(Context context) throws IllegalArgumentException, SecurityException, IllegalStateException,
  IOException {
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(context, soundUri);
final AudioManager audioManager = (AudioManager)  context.getSystemService(Context.AUDIO_SERVICE);
if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
  mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
  mMediaPlayer.setLooping(false);
  mMediaPlayer.prepare();
  mMediaPlayer.start();
 }
}

我的问题是它在模拟器和其他设备上运行良好,但不适用于三星和 Micromax 设备。

getList()方法:

public String getList(Context context,Date c)
 {
     String check = "Default";
     SQLiteDatabase sampleDB= context.openOrCreateDatabase(SAMPLE_DB_NAME, Context.MODE_PRIVATE, null);
 Cursor cc = sampleDB.rawQuery("SELECT * FROM " + SAMPLE_TABLE_NAME, null);  
 Log.d("Sent date is :-",c.toString());
 if(cc != null)
     if(cc.moveToFirst())
     do
     {
         Log.d("in do", "Success");
         Date v = new Date(cc.getString(2).trim());  
         if(v.getTime() - c.getTime() >= 0 && v.getTime() - c.getTime() <=1000){   
             Log.d("inside first if", "Success");
            Log.d("Number is",cc.getString(1));
            if(cc.getString(3).equals("ON")){
                 Log.d("inside second if", "Success");
                  try{
                         playSound(context);
                         }
                         catch(Exception e)
                         {

                         }
            Toast.makeText(context, "A call is scheduled for" + cc.getString(1)+".and it is about to be triggered", Toast.LENGTH_LONG).show();
            check = cc.getString(1);
            break;
            }

         }

         }while(cc.moveToNext());

     sampleDB.close();
     return check;

 }

下面是我的错误日志:

12-06 10:17:59.424: E/AndroidRuntime(27514): FATAL EXCEPTION: main
12-06 10:17:59.424: E/AndroidRuntime(27514): java.lang.RuntimeException: Unable to start receiver com.example.callsmsscheduler.MyAlarm: java.lang.IllegalArgumentException: Parse error: Fri Dec 06 10:16:00 IST 2013
12-06 10:17:59.424: E/AndroidRuntime(27514):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2377)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at android.app.ActivityThread.access$1500(ActivityThread.java:149)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1381)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at android.os.Looper.loop(Looper.java:153)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at android.app.ActivityThread.main(ActivityThread.java:5000)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at java.lang.reflect.Method.invokeNative(Native Method)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at java.lang.reflect.Method.invoke(Method.java:511)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at dalvik.system.NativeStart.main(Native Method)
12-06 10:17:59.424: E/AndroidRuntime(27514): Caused by: java.lang.IllegalArgumentException: Parse error: Fri Dec 06 10:16:00 IST 2013
12-06 10:17:59.424: E/AndroidRuntime(27514):    at java.util.Date.parseError(Date.java:360)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at java.util.Date.parse(Date.java:510)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at java.util.Date.<init>(Date.java:149)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at com.example.callsmsscheduler.MyAlarm.getList(MyAlarm.java:65)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at com.example.callsmsscheduler.MyAlarm.onReceive(MyAlarm.java:134)
12-06 10:17:59.424: E/AndroidRuntime(27514):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2370)
12-06 10:17:59.424: E/AndroidRuntime(27514):    ... 10 more

最佳答案

而不是

Date v = new Date(cc.getString(2).trim());  

尝试这样的事情:

 SimpleDateFormat parserSDF=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        String dateInString = "7-Jun-2013";

        try {

            Date v= formatter.parse(dateInString);


        } catch (ParseException e) {
            e.printStackTrace();
        }

确保您的字符串采用 SimpleDateFormat 中提到的有效格式。

查看更改后的 SimpleDateFormat

SimpleDateFormat parserSDF=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

关于java - 广播接收器使某些设备中的应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20400298/

相关文章:

java - 有没有办法在不查看 shell 输出的情况下确定 Java 版本?

Android 布局 - 文字太宽?

android - 使用 ADT 插件 Eclipse 将 Android 应用程序转换为黑莓

android - 在 startActivityForResult 中传递数据并在 onActivityResult 中取回

java - while 循环 : while sentence does not contain a word

Java8 : About Functional Interface

android - 将数据从一个 Activity 设置到另一个 Activity

android - 从 intent android 获取错误的值

java - 向前跳到特定的 JDBC 记录号

android - 如何使用 ACTION_OPEN_DOCUMENT 显示更多提供商