#環境
開発 Androidstudio 3.6
機種 Pixel3(エミュレータ)
OS android10
言語 Java
#背景
以前作成したアラームアプリを改善しようとしています。
設定した時間になるとbroadcastのOnreceive内からstartActivityでアラーム用のActivityを起動する仕組み
で動かしていました。
android10でのバックグラウンド起動の仕様変更にともなってアラーム起動用のServiceを作成しstartForegroundServiceを使い
アラーム用のActivityを起動しています。
困っていること
android10で画面のロックパスワードを設定した場合(エミュレータではPINを設定)ロック中は時間になってもアラーム用のActivityが起動されません。
パスワードを設定しない場合は起動できます。またandroid9以前の機種ですとロック画面上にアラーム用のActivityが表示されます。
デバッグで調査してわかったのはロック中はStartActivityでエラーにはなりませんがアラーム用のActivityに飛んでいないことぐらいです・・・(アラーム用のActivityのブレークポイントに飛ばない)
#実現したいこと
ロックが設定されているandroid10の機種にロックを解除しアラーム用のActivityを表示したいです。
playstoreに公開されているアラーム系のアプリでは下記のほかにもロック中のandroid10でも時間になればActivityが表示されるものがいくつか見られますので方法はあると思うのですが自分には見つけることができませんでした・・・
ご存知の方ご教授よろしくお願いいたします。
##参考
ロックが設定されているandroid10の機種でもロック画面の上にActivityを表示できるアラーム系アプリ
アラームアプリ1
アラームアプリ2
#ソースコード
####サービス起動用ブロードキャスト
AlarmBroadcastReceiver.java
Java
1public class AlarmBroadcastReceiver extends BroadcastReceiver{ 2 Context context; 3 //グローバル変数の設定 4 MyApplication MyGlobal=new MyApplication(); 5 //アラームの名前 6 private String alarmName=""; 7 //バイブ用クラス 8 Vibe vibe=new Vibe(); 9 //バイブ起動用のクラス 10 private Intent intent2; 11 12 @Override 13 public void onReceive(Context context, Intent intent) { 14 //android.os.Debug.waitForDebugger(); 15 //グローバル変数を取得 16 MyGlobal = (MyApplication) context.getApplicationContext(); 17 this.context = context; 18 Log.d("AlarmBroadcastReceiver", "onReceive() pid=" + android.os.Process.myPid()); 19 //インテントの読み込み 20 int position=intent.getIntExtra("SET_ALARM_POSITION", 0); 21 //アラームID 22 int bid =intent.getIntExtra("SET_ALARM_ID", 0); 23 //ネームリストの読み込み 24 alarmName =intent.getStringExtra("SET_ALARM_NAME"); 25 //バイブ用に送るインテント 26 //android10以上ならサービス用クラスのintentを作成 27 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { 28 intent2 = new Intent(context.getApplicationContext(), StartVibeService.class); 29 } 30 else 31 //省略 32 33 //アラームの属性を代入 34 intent2.putExtra("SET_ALARM_NAME",alarmName); 35 intent2.putExtra("SET_ALARM_POSITION",position); 36 intent2.putExtra("SET_ALARM_ID",bid); 37 38 //androidのosによって場合分け 39 ////android 10以上 40 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { 41 //foregroundServiceでバイブアクティビティ呼び出しサービスを実行 42 context.startForegroundService(intent2); 43 } 44 //その他 45 else { 46 //省略 47 } 48 } 49}
####アラームのアクティビティ起動用のサービス
StartVibeService.java
Java
1public class StartVibeService extends Service { 2 //notificationのチャンネル名 3 public static final String CHANNEL_NAME = "SimpleAlarm"; 4 //notificationのチャンネルID 5 public static final String CHANNEL_ID = "0625"; 6 7 @Override 8 public void onCreate() { 9 if (android.os.Debug.isDebuggerConnected()) { 10 android.os.Debug.waitForDebugger(); 11 } 12 super.onCreate(); 13 } 14 15 @Override 16 public int onStartCommand(Intent intent, int flags, int startId) 17 { 18 Context context = getApplicationContext(); 19 final NotificationManager notificationManager = (NotificationManager)context.getSystemService(NOTIFICATION_SERVICE); 20 //インテントから値を取得 21 int alarmID=intent.getIntExtra("SET_ALARM_ID",0); 22 String alarmName=""; 23 alarmName=intent.getStringExtra("SET_ALARM_NAME"); 24 int alarmPosition=intent.getIntExtra("SET_ALARM_POSITION", 0); 25 26 //チャンネル設定 27 SetChannel(notificationManager); 28 29 PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(context.getApplicationContext(), alarmID, 30 intent, PendingIntent.FLAG_UPDATE_CURRENT); 31 //通知設定 32 NotificationCompat.Builder notificationBuilder = 33 new NotificationCompat.Builder(context.getApplicationContext(),CHANNEL_ID) 34 .setSmallIcon(R.drawable.cast_ic_notification_small_icon) 35 .setContentTitle(alarmName) 36 .setContentText(context.getString(R.string.setTimeCame)) 37 .setPriority(NotificationCompat.PRIORITY_HIGH) 38 .setCategory(NotificationCompat.CATEGORY_ALARM) 39 .setFullScreenIntent(fullScreenPendingIntent, true); 40 41 Notification incomingCallNotification = notificationBuilder.build(); 42 43 // startForeground 44 startForeground(1, incomingCallNotification); 45 46 //以下に処理を書く 47 //キーガード解除 48 LockRelease(); 49 //バイブのアクティビティ用インテントを作成 50 Intent intentVibeActivity = new Intent(context.getApplicationContext(), Alarm_vib.class); 51 //インテントに値を代入 52 intentVibeActivity.putExtra("SET_ALARM_POSITION",alarmPosition); 53 //フラグを立てておく 54 intentVibeActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 55 //アラーム用のアクティビティ起動 56 context.startActivity(intentVibeActivity); 57 58 return START_NOT_STICKY; 59 } 60 61 @Nullable 62 @Override 63 public IBinder onBind(Intent intent) { 64 return null; 65 } 66 //チャンネルセット用 67 private void SetChannel(NotificationManager manager) { 68 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 69 NotificationChannel channel = new NotificationChannel( 70 // 一意のチャンネルID 71 // ここはどこかで定数にしておくのが良さそう 72 CHANNEL_ID, 73 // 設定に表示されるチャンネル名 74 CHANNEL_NAME, 75 // チャンネルの重要度 76 NotificationManager.IMPORTANCE_DEFAULT 77 ); 78 // 通知時にライトを有効にする 79 channel.enableLights(true); 80 // 通知時のライトの色 81 channel.setLightColor(Color.WHITE); 82 // ロック画面での表示レベル 83 channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); 84 // チャンネルの登録 85 manager.createNotificationChannel(channel); 86 } 87 } 88 private void LockRelease() 89 { 90 KeyguardManager.KeyguardLock keylock; 91 PowerManager.WakeLock wakelock; 92 //キーガード解除 93 wakelock = ((PowerManager) getSystemService(android.content.Context.POWER_SERVICE)) 94 .newWakeLock(PowerManager.FULL_WAKE_LOCK 95 | PowerManager.ACQUIRE_CAUSES_WAKEUP 96 | PowerManager.ON_AFTER_RELEASE, "vib:disableLock"); 97 wakelock.acquire(); 98 99 wakelock.release(); 100 //ロック解除 101 KeyguardManager keyguard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 102 keylock = keyguard.newKeyguardLock("disableLock"); 103 keylock.disableKeyguard(); 104 } 105}
####アラームのアクティビティ(画面立ち上げ部分とアラーム部分 他は長いため省略)
Alarm_vib.java
java
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.vib_layout); 5 //スリープの解除 6 wakeFromSleep(); 7 /* 8 省略 9 */ 10 //アラームの再セット 11 Alarm_set(); 12 //バイブの起動 13 VibeOn(); 14 } 15 16 //スリープ解除関数 17 private void wakeFromSleep() { 18 // Lock解除画面より手前に表示させる 19 final Window win = getWindow(); 20 win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 21 | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 22 23 wakelock = ((PowerManager) getSystemService(android.content.Context.POWER_SERVICE)) 24 .newWakeLock(PowerManager.FULL_WAKE_LOCK 25 | PowerManager.ACQUIRE_CAUSES_WAKEUP 26 | PowerManager.ON_AFTER_RELEASE, "vib:disableLock"); 27 wakelock.acquire(); 28 29 wakelock.release(); 30 //ロック解除 31 KeyguardManager keyguard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 32 keylock = keyguard.newKeyguardLock("disableLock"); 33 keylock.disableKeyguard(); 34 }
####アプリのManifest(長いので一部省略)
xml
1<?xml version="1.0" encoding="utf-8"?> 2<manifest> 3 4 <!--パーミッション--> 5 <uses-permission android:name="android.permission.WAKE_LOCK" /> 6 <uses-permission android:name="android.permission.VIBRATE" /> 7 <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 8 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> 9 <!--アプリ--> 10 <application 11 android:name=".MyApplication" 12 android:allowBackup="true" 13 android:icon="@mipmap/ic_launcher" 14 android:label="@string/app_name" 15 android:roundIcon="@mipmap/ic_launcher_round" 16 android:supportsRtl="true" 17 android:theme="@style/Theme.AppCompat.Light.NoActionBar"> 18 19 20 21 <!--一部省略--> 22 <!--アラーム鳴動用--> 23 <activity android:name=".Alarm_vib"> 24 <intent-filter> 25 <action android:name="android.intent.action.MAIN" /> 26 <category android:name="android.intent.category.DEFAULT" /> 27 </intent-filter> 28 </activity> 29 <!--時間になった時の受け取り--> 30 <receiver 31 android:name=".AlarmBroadcastReceiver" 32 android:process=":remote"> 33 <intent-filter> 34 <category android:name="android.intent.category.DEFAULT" /> 35 </intent-filter> 36 </receiver> 37 <!--サービス起動用--> 38 <service android:name=".StartVibeService" /> 39 40 <!--一部省略--> 41 42 </application> 43</manifest>
回答1件
あなたの回答
tips
プレビュー