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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

解決済

android 最前面にオーバーレイで画像を表示したい

takori
takori

総合スコア20

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

1回答

0リアクション

1クリップ

356閲覧

投稿2022/08/25 10:05

前提

androidの最前面にオーバーレイで画像を表示するアプリをこのページを参考にして作っていますが画像が表示されません。

実現したいこと

最前面にオーバーレイで画像を表示したい。

発生している問題・エラーメッセージ

エラーメッセージはないが画像が表示されない。

該当のソースコード

MainActivity.kt(kotlin)

package xxx import android.content.Intent import android.net.Uri import android.os.Bundle import android.provider.Settings import android.view.View import android.widget.Button import android.widget.Toast import androidx.activity.result.ActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { private var intentService: Intent? = null private val launcher = registerForActivityResult<Intent, ActivityResult>( ActivityResultContracts.StartActivityForResult() ) { result: ActivityResult? -> if (Settings.canDrawOverlays(this)) { startForegroundService(intentService) } else { Toast.makeText( application, R.string.message, Toast.LENGTH_LONG ).show() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) intentService = Intent(application, TestService::class.java) // Serviceを開始するためのボタン val buttonStart = findViewById<Button>(R.id.button_start) buttonStart.setOnClickListener { v: View? -> if (Settings.canDrawOverlays(this)) { startForegroundService(intentService) } else { val intent = Intent( Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName") ) startActivity(intent) launcher.launch(intent) } } } }

TestService.kt(kotlin)

package xxx import android.app.* import android.content.Context import android.content.Intent import android.graphics.PixelFormat import android.os.IBinder import android.util.Log import android.view.* class TestService : Service() { private var context: Context? = null private var notificationManager: NotificationManager? = null private var newView: View? = null private var windowManager: WindowManager? = null override fun onCreate() { super.onCreate() context = applicationContext notificationManager = context!! .getSystemService(NOTIFICATION_SERVICE) as NotificationManager // inflaterの生成 val layoutInflater = LayoutInflater.from(this) // レイアウトファイルからInfalteするViewを作成 val nullParent: ViewGroup? = null newView = layoutInflater.inflate(R.layout.service_layer, nullParent) } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { val channelId = "default" val title = context!!.getString(R.string.app_name) val pendingIntent = PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_MUTABLE ) // Notification Channel 設定 val channel = NotificationChannel( channelId, title, NotificationManager.IMPORTANCE_DEFAULT ) if (notificationManager != null) { notificationManager!!.createNotificationChannel(channel) val notification = Notification.Builder(context, channelId) .setContentTitle(title) // android標準アイコンから .setSmallIcon(android.R.drawable.btn_star) .setContentText("APPLICATION_OVERLAY") .setAutoCancel(true) .setContentIntent(pendingIntent) .setWhen(System.currentTimeMillis()) .build() // startForeground startForeground(1, notification) } val typeLayer = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY windowManager = applicationContext .getSystemService(WINDOW_SERVICE) as WindowManager val params = WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, typeLayer, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT ) // dipを取得 val dpScale = resources.displayMetrics.density.toInt() // 右上に配置 params.gravity = Gravity.TOP or Gravity.END params.x = 20 * dpScale // 20dp params.y = 80 * dpScale // 80dp // ViewにTouchListenerを設定する newView!!.setOnTouchListener { v: View?, event: MotionEvent -> Log.d("debug", "onTouch") if (event.action == MotionEvent.ACTION_DOWN) { Log.d("debug", "ACTION_DOWN") } if (event.action == MotionEvent.ACTION_UP) { Log.d("debug", "ACTION_UP") // warning: override performClick() newView!!.performClick() // Serviceを自ら停止させる stopSelf() } false } // Viewを画面上に追加 windowManager!!.addView(newView, params) return super.onStartCommand(intent, flags, startId) } override fun onDestroy() { super.onDestroy() Log.d("debug", "onDestroy") // Viewを削除 windowManager!!.removeView(newView) } override fun onBind(intent: Intent): IBinder? { return null } }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".MainActivity"> <Button android:id="@+id/button_start" android:text="@string/button" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

service_layer.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/description" android:src="@drawable/gazou" /> </RelativeLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="io.github.takogori.datausagetest3"> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Datausagetest3" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>

補足情報(FW/ツールのバージョンなど)

Android Studioのバージョン:Android Studio Chipmunk | 2021.2.1 Patch 2
使用している言語:kotlin
min sdk version:API26 Android8.0 (Marshmallow)
使用している実機:Pixel5a(android12)

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jimbe

2022/08/25 12:58

drawable/gazou はどのようなファイルでしょうか。
jimbe

2022/08/25 13:21 編集

androidmanifest.xml にサービスの定義が見当たらないようですが…合っていますか? ボタンを押した時に logcat に「W/ActivityManager: Unable to start service Intent { cmp=[パッケージ名]/.TestService } U=0: not found」といったメッセージは出ていませんか?
takori

2022/08/26 04:41

ありがとうございます。 ・drawable/gazou は800×720のPNG画像(32-bitcolor 14.02kb)です。 ・ボタンを押してもlogcatに「W/ActivityManager: Unable to start service Intent { cmp=[パッケージ名]/.TestService } U=0: not found」というメッセージは表示されなかったです。 一応、実行した後のlogcatはこんな感じです。↓ 2022-08-26 13:38:19.682 4822-4822/io.github.takogori.datausagetest3 W/ziparchive: Unable to open '/data/app/~~PRooV54ur_iH3VRz3GHUjg==/io.github.takogori.datausagetest3-eOaCD2NSnqcZwce0bQP5nw==/base.dm': No such file or directory 2022-08-26 13:38:19.613 4822-4822/? I/.datausagetest: Late-enabling -Xcheck:jni 2022-08-26 13:38:19.641 4822-4822/? D/ProcessState: Binder ioctl to enable oneway spam detection failed: Invalid argument 2022-08-26 13:38:19.650 4822-4822/? W/re-initialized>: type=1400 audit(0.0:7698): avc: granted { execute } for path="/data/data/io.github.takogori.datausagetest3/code_cache/startup_agents/4ba71210-agent.so" dev="dm-34" ino=135047 scontext=u:r:untrusted_app:s0:c15,c257,c512,c768 tcontext=u:object_r:app_data_file:s0:c15,c257,c512,c768 tclass=file app=io.github.takogori.datausagetest3 2022-08-26 13:38:19.657 4822-4822/? V/studio.deploy: No existing instrumentation found. Loading instrumentation from instruments-1f2f27f8.jar 2022-08-26 13:38:19.663 4822-4822/io.github.takogori.datausagetest3 W/.datausagetest: DexFile /data/data/io.github.takogori.datausagetest3/code_cache/.studio/instruments-1f2f27f8.jar is in boot class path but is not in a known location 2022-08-26 13:38:19.664 4822-4822/io.github.takogori.datausagetest3 V/studio.deploy: Applying transforms with cached classes 2022-08-26 13:38:19.670 4822-4822/io.github.takogori.datausagetest3 W/.datausagetest: Redefining intrinsic method java.lang.Thread java.lang.Thread.currentThread(). This may cause the unexpected use of the original definition of java.lang.Thread java.lang.Thread.currentThread()in methods that have already been compiled. 2022-08-26 13:38:19.670 4822-4822/io.github.takogori.datausagetest3 W/.datausagetest: Redefining intrinsic method boolean java.lang.Thread.interrupted(). This may cause the unexpected use of the original definition of boolean java.lang.Thread.interrupted()in methods that have already been compiled. 2022-08-26 13:38:19.673 4822-4822/io.github.takogori.datausagetest3 D/CompatibilityChangeReporter: Compat change id reported: 171979766; UID 10271; state: ENABLED 2022-08-26 13:38:19.682 4822-4822/io.github.takogori.datausagetest3 W/ziparchive: Unable to open '/data/app/~~PRooV54ur_iH3VRz3GHUjg==/io.github.takogori.datausagetest3-eOaCD2NSnqcZwce0bQP5nw==/base.dm': No such file or directory 2022-08-26 13:38:19.793 4822-4822/io.github.takogori.datausagetest3 V/GraphicsEnvironment: ANGLE Developer option for 'io.github.takogori.datausagetest3' set to: 'default' 2022-08-26 13:38:19.794 4822-4822/io.github.takogori.datausagetest3 V/GraphicsEnvironment: ANGLE GameManagerService for io.github.takogori.datausagetest3: false 2022-08-26 13:38:19.794 4822-4822/io.github.takogori.datausagetest3 V/GraphicsEnvironment: Updatable production driver is not supported on the device. 2022-08-26 13:38:19.796 4822-4822/io.github.takogori.datausagetest3 D/NetworkSecurityConfig: No Network Security Config specified, using platform default 2022-08-26 13:38:19.796 4822-4822/io.github.takogori.datausagetest3 D/NetworkSecurityConfig: No Network Security Config specified, using platform default 2022-08-26 13:38:19.870 4822-4822/io.github.takogori.datausagetest3 W/.datausagetest: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (unsupported, reflection, allowed) 2022-08-26 13:38:19.870 4822-4822/io.github.takogori.datausagetest3 W/.datausagetest: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (unsupported, reflection, allowed) 2022-08-26 13:38:19.942 4822-4842/io.github.takogori.datausagetest3 I/AdrenoGLES-0: QUALCOMM build : 4783c89, I46ff5fc46f Build Date : 11/30/20 OpenGL ES Shader Compiler Version: EV031.31.04.01 Local Branch : QPR2 Remote Branch : Remote Branch : Reconstruct Branch : 2022-08-26 13:38:19.942 4822-4842/io.github.takogori.datausagetest3 I/AdrenoGLES-0: Build Config : S P 10.0.4 AArch64 2022-08-26 13:38:19.942 4822-4842/io.github.takogori.datausagetest3 I/AdrenoGLES-0: Driver Path : /vendor/lib64/egl/libGLESv2_adreno.so 2022-08-26 13:38:19.943 4822-4842/io.github.takogori.datausagetest3 D/hw-ProcessState: Binder ioctl to enable oneway spam detection failed: Invalid argument 2022-08-26 13:38:19.946 4822-4842/io.github.takogori.datausagetest3 I/AdrenoGLES-0: PFP: 0x016dd093, ME: 0x00000000 2022-08-26 13:38:19.952 4822-4842/io.github.takogori.datausagetest3 W/AdrenoUtils: <ReadGpuID_from_sysfs:197>: Failed to open /sys/class/kgsl/kgsl-3d0/gpu_model 2022-08-26 13:38:19.952 4822-4842/io.github.takogori.datausagetest3 W/AdrenoUtils: <ReadGpuID:221>: Failed to read chip ID from gpu_model. Fallback to use the GSL path 2022-08-26 13:38:19.957 4822-4842/io.github.takogori.datausagetest3 D/hw-ProcessState: Binder ioctl to enable oneway spam detection failed: Invalid argument 2022-08-26 13:38:49.308 4822-4835/io.github.takogori.datausagetest3 W/System: A resource failed to call close.
takori

2022/08/26 05:11

androidmanifest.xml にサービスを宣言したら表示されました!ありがとうございます。
jimbe

2022/08/26 10:32

> メッセージは表示されなかったです。 そういえばウチの実機は Android10 でしたので、もしかしたらバージョンで表示が違うのかもしれませんね。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。