質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

12903閲覧

android10 ロック画面の上でActivityを起動

hashimoyakumo

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/03/02 14:15

編集2020/03/04 13:22

#環境
開発 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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakajika

2020/03/04 01:24

起動したいActivityの方にロック画面に関する設定は何かしていますか?可能であればソースおよびAndroidManifest内の設定を載せてください。
hashimoyakumo

2020/03/04 13:23 編集

画面をウェイクしバイブを起動するアラーム鳴動用のソースとマニフェストを一部追記しました。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

Android10端末でのみ表示できていないというのがちょっと引っかかりますが(バックグラウンド起動制限の影響?)、ロック画面時にActivityを先頭に表示できるようにする設定としては以下のものがあります。

  • ** API 27(O_MR1)以降**

Activity#setShowWhenLocked
Activity#setTurnScreenOn

もしくはAndroidManifest内で設定

xml

1<activity 2 ... 3 android:showWhenLocked="true" 4 android:turnScreenOn="true" 5 />
  • API 27未満

WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED
WindowManager.LayoutParams#FLAG_TURN_SCREEN_ON

これらを設定して試してみてください。

投稿2020/03/04 14:04

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hashimoyakumo

2020/03/04 14:54

ご回答ありがとうございます。 設定してみましたが起動しませんでした・・・ やはりバックグラウンド起動制限の影響とは思うのですが、端末にロックをかけない状態ですと 起動できるんですよね・・・
kakajika

2020/03/05 15:55 編集

うーん、なるほど。。 ご提示のソースを読み返してみたところ、fullscreenPendingIntentの生成コードがおかしいようなのでこちらが原因かもしれません。PendingIntent.getActivity(...)の第3引数にはServiceのintentではなく起動したいActivity向けのIntentを渡す必要があります。 https://developer.android.com/training/notify-user/time-sensitive?hl=ja それと、fullscreen intentを利用するためのパーミッションも抜けているようですから、Manifestに追加してみてください。 <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
kakajika

2020/03/05 23:00

もう1点ありました。NotificationChannelの重要度がIMPORTANCE_DEFAULTになっているので、IMPORTANCE_HIGHに変更する必要があります。参考: https://teratail.com/questions/222556 この変更を反映するにはチャンネルIDを変更するか、アプリをアンインストールしてから実行してください。
hashimoyakumo

2020/03/10 14:50

ご提示いただいた方法をすべて試してみたところロック中でもActivityが表示されるようになりました! 自身の知識、調査不足を痛感いたしました・・・ お忙しい中ご回答いただきありがとうございました。 重ねてお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問