2

我正在使用Alarm Manager。我使用了一项服务来启动,并会响起一个声音。但该服务并未开始。任何人都可以提出有关服务,待定意图和识别我的代码中的错误。代码从网上复制。Android AlarmManager使用铃声启动服务

这是我AndroidScheduledActivity.java

public class AndroidScheduledActivity extends Activity { 

    private PendingIntent pendingIntent; 

    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     Button buttonStart = (Button) findViewById(R.id.startalarm); 

     Button buttonCancel = (Button) findViewById(R.id.cancelalarm); 

     buttonStart.setOnClickListener(new Button.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       // TODO Auto-generated method stub 

       Intent myIntent = new Intent(AndroidScheduledActivity.this, 
         MyAlarmService.class); 

       pendingIntent = PendingIntent.getService(AndroidScheduledActivity.this, 
         0, myIntent, 0); 

       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

       Calendar calendar = Calendar.getInstance(); 

       calendar.setTimeInMillis(System.currentTimeMillis()); 

       calendar.add(Calendar.SECOND, 10); 

       alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
         pendingIntent); 

       Toast.makeText(AndroidScheduledActivity.this, "Start Alarm", 
         Toast.LENGTH_LONG).show(); 
       Log.d("Alarm", "Alarm Started"); 

      } 
     }); 

     buttonCancel.setOnClickListener(new Button.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       // TODO Auto-generated method stub 

       AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

       alarmManager.cancel(pendingIntent); 

       // Tell the user about what we did. 

       Toast.makeText(AndroidScheduledActivity.this, "Cancel!", 
         Toast.LENGTH_LONG).show(); 

      } 
     }); 

    } 
} 

这是我MyAlarmService.java

public class MyAlarmService extends Service { 

    @Override 
    public void onCreate() { 

     // TODO Auto-generated method stub 

     Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 

     // TODO Auto-generated method stub 

     Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show(); 

     return null; 

    } 

    @Override 
    public void onDestroy() { 

     // TODO Auto-generated method stub 

     super.onDestroy(); 

     Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     Log.d("AlarmService", "Alarm Starting to ring"); 

     Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     MediaPlayer mp = MediaPlayer.create(getBaseContext(), alert); 
     mp.setVolume(100, 100); 
     mp.start(); 
     mp.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       mp.release(); 
      } 
     }); 

     Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
     vibrator.vibrate(400); 

     Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG).show(); 

     return Service.START_STICKY; 

    } 

    @Override 
    public boolean onUnbind(Intent intent) { 

     // TODO Auto-generated method stub 

     Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG).show(); 

     return super.onUnbind(intent); 

    } 

} 

而且我menifest.xml文件

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.alarm_basic" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.alarm_basic.AndroidScheduledActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name=".MyAlarmService" /> 
    </application> 

</manifest> 
+0

您的应用程序崩溃,我的意思是你得到任何异常,当触发报警?如果您的应用程序确实崩溃,请在此提供LogCat,以便我们可以清楚地了解它为何发生。 – saiful103a

+0

不,我的应用程序在测试时没有崩溃。 我认为我的问题已解决 – Mazhar

回答

1
Intent intent = new Intent(DashboardScreen.this, ServiceClass.class); 
PendingIntent pintent = PendingIntent.getService(DashboardScreen.this, 0, intent, 0); 
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

试试吧,并让我知道发生了什么...

在你manifest.xml文件

<service android:enabled="true" android:name=".ServiceClass" /> 
1
  1. 添加权限清单档案中的

    < uses-permission android:name="android.permission.VIBRATE" /> 
    
  2. 应检查振动器为空或不是。

    Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);    
    if (vibrator != null) 
        vibrator.vibrate(400); 
    
+0

谢谢解决一些问题。 但我的主要问题不是。所以,我决定选择Hardik的答案。 – Mazhar

3

还需要检查wheather铃声为空也。

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
Ringtone r = RingtoneManager.getRingtone(getBaseContext(), alert); 

if(r == null){ 

    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    r = RingtoneManager.getRingtone(getBaseContext(), alert); 

    if(r == null){ 
     alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
     r = RingtoneManager.getRingtone(getBaseContext(), alert);    
    } 
} 
if(r != null) 
    r.play(); 

或者otherway

MediaPlayer mp = MediaPlayer.create(getBaseContext(), alert); 
    if(mp !=null) {  
     mp.setVolume(100, 100); 
     mp.start(); 
     mp.setOnCompletionListener(new OnCompletionListener() { 

      @Override 
      public void onCompletion(MediaPlayer mp) { 
       mp.release(); 
      } 
     }); 
    }