Translate

BTemplates.com

Powered by Blogger.

2018年2月26日月曜日

2018-02-25 到達点メモ


一日で終わるかもと言っておきながら全然進まなかったが、
見直してみたら思ってたより進んでいた。
よく考えたらすぐできる実装なので実装した。できた。
そういう訳で、特定のアプリが立ち上がった時に割り込みで
立ち上がるようにすることができました。
やったぜ!!
他のアプリの状況を知りたい場合は、UsageStatsManagerを使うとよいらしい


下記のサイトを参考にした
[Android][Lollipop]UsageStatsManagerでgetRunningAppぽく取得する
Android 6.0 : UsageEvents method 'usageStatsManger.queryEvents()' is giving count 0 (zero)
【Android】getRunningTasksが使えなくなったLollipopでアプリ使用状況を取得する
[Android]自分のアプリが前面にいるかを判別する正しい方法(UsageStatsManager.queryEventsを使う(API21以降/要Permission)の項目)
ACTION_OUTSIDEが切り開くAndroidアプリ間連携の可能性 (2/4)


具体的に以下のように実装した

//履歴を取得の許可がでていなかったら、その画面に飛ぶ
if (isUsageStatsAllowed() == false){ startActivity( Intent("android.settings.USAGE_ACCESS_SETTINGS")) }
val userInfoString:String? = prefs.getString("PREF_KYE", null)
if (userInfoString != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ){
    var userInfo = gson.fromJson<UserInfo>(userInfoString, UserInfo::class.java!!)
    val stats = getSystemService(Service.USAGE_STATS_SERVICE) as UsageStatsManager
    val endTime = System.currentTimeMillis()
    val startTime = endTime - (10*1000).toLong()
    val nameList = ArrayList<ComponentName>()
    val usageEvents = stats.queryEvents(startTime, endTime)
    while (usageEvents.hasNextEvent()){
        Log.d(TAG,"usageEvents.hasNextEvent()")
        val event = android.app.usage.UsageEvents.Event()
        usageEvents.getNextEvent(event)
        if(event.eventType == UsageEvents.Event.MOVE_TO_FOREGROUND){
            val packageName = event.packageName
            val name = ComponentName(packageName, event.className)
            // リストにの先頭に追加する
            nameList.add(0, name)
            //普通にFOREGROUNDは複数あるようなのでbreakしない
        }
    }
    if(nameList.isEmpty() == false) {
        Log.d(TAG, "nameList[0].packageName:" + nameList[0].packageName)
        for (limitAppInfos: MutableMap.MutableEntry<String, LimitAppInfo> in userInfo.limitAppInfos) {
            if (limitAppInfos.value.limitFlag == false) {
                continue
            }
            val appPackageName = limitAppInfos.key
            if (nameList[0].packageName.equals(appPackageName)) {
                Log.d(TAG, appPackageName + " Looked")
                break
            }
        }
    }
}


◎此処までたどり着く際に詰まったところ


・uses-permission の設定

最初は以下のように設定していたのだが、エラー(赤の波線)が出ていた
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
で、以下のように設定しないとまずいらしい
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />
理由は後日調べます


・stats.queryEvents(startTime, endTime)で、どっちが最近の時間?

startTimeは昔の時間。endTimeは最近の時間


・getSystemService("usagestats")で書くと赤い波線が出る。

getSystemService(Service.USAGE_STATS_SERVICE)と指定してあげるとよい


・コード的に正しいはずなのに、現在アクティブなアプリのデータを取得しない

使用するアプリが履歴を読み取ることを許可していますか?

大体こんなところだと思う。
一時はどうなるかと思ったが無事今月の最低限の目標は達成できたので
今日はここまで。

0 コメント:

コメントを投稿