前提・実現したいこと
Android studioにてアラームを自分で設定し、その時間に通知が来るというのを実装したいのですが、アプリを起動したところすぐにアプリが落ちてしまいます。
該当のソースコード
Java
ソースコード ↓
MainActivity
package com.example.notification;
import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Locale;
import static java.lang.String.format;
public class MainActivity extends AppCompatActivity {
private AlarmManager am; private PendingIntent pending; private int requestCode = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button buttonStart = this.findViewById(R.id.button_start); buttonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Calendar calendar; calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, Integer.parseInt(time)); Intent intent = new Intent(getApplicationContext(), AlarmNotification.class); intent.putExtra("RequestCode",requestCode); pending = PendingIntent.getBroadcast( getApplicationContext(),requestCode, intent, 0); // アラームをセットする am = (AlarmManager) getSystemService(ALARM_SERVICE); if (am != null) { am.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pending); // トーストで設定されたことをを表示 Toast.makeText(getApplicationContext(), "alarm start", Toast.LENGTH_SHORT).show(); Log.d("debug", "start"); } } }); // アラームの取り消し Button buttonCancel = findViewById(R.id.button_cancel); buttonCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent indent = new Intent(getApplicationContext(), AlarmNotification.class); PendingIntent pending = PendingIntent.getBroadcast( getApplicationContext(), requestCode, indent, 0); // アラームを解除する AlarmManager am = (AlarmManager)MainActivity.this. getSystemService(ALARM_SERVICE); if (am != null) { am.cancel(pending); Toast.makeText(getApplicationContext(), "alarm cancel", Toast.LENGTH_SHORT).show(); Log.d("debug", "cancel"); } else{ Log.d("debug", "null"); } } }); } EditText settingsTime = findViewById(R.id.jikoku); String time = settingsTime.getText().toString(); }
AlarmNotification
package com.example.notification;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class AlarmNotification extends BroadcastReceiver{
@Override // データを受信した
public void onReceive(Context context, Intent intent) {
Log.d("AlarmBroadcastReceiver","onReceive() pid=" + android.os.Process.myPid()); int requestCode = intent.getIntExtra("RequestCode",0); PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); String channelId = "default"; // app name String title = context.getString(R.string.app_name); long currentTime = System.currentTimeMillis(); SimpleDateFormat dataFormat = new SimpleDateFormat("HH:mm:ss", Locale.JAPAN); String cTime = dataFormat.format(currentTime); // メッセージ + 11:22:331 String message = "時間になりました。 "+cTime ; NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); // Notification Channel 設定 NotificationChannel channel = new NotificationChannel( channelId, title , NotificationManager.IMPORTANCE_DEFAULT); channel.setDescription(message); channel.enableVibration(true); channel.canShowBadge(); channel.enableLights(true); channel.setLightColor(Color.BLUE); // the channel appears on the lockscreen channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE); channel.setSound(defaultSoundUri, null); channel.setShowBadge(true); if(notificationManager != null){ notificationManager.createNotificationChannel(channel); Notification notification = new Notification.Builder(context, channelId) .setContentTitle(title) // android標準アイコンから .setSmallIcon(android.R.drawable.ic_lock_idle_alarm) .setContentText(message) .setAutoCancel(true) .setContentIntent(pendingIntent) .setWhen(System.currentTimeMillis()) .build(); // 通知 notificationManager.notify(R.string.app_name, notification); } }
}
試したこと
使われていないコードなどを確認してみましたが、わかりませんでした。
補足情報(FW/ツールのバージョンなど)
Nexus6P API28
あなたの回答
tips
プレビュー