Skip to content

Instantly share code, notes, and snippets.

@jaredrummler
Last active January 19, 2020 23:56
Show Gist options
  • Select an option

  • Save jaredrummler/72e49ee8529e9d19d1b2392202ac39c1 to your computer and use it in GitHub Desktop.

Select an option

Save jaredrummler/72e49ee8529e9d19d1b2392202ac39c1 to your computer and use it in GitHub Desktop.

STEPS TO GRANT android.permission.PACKAGE_USAGE_STATS

  1. Build and launch app (notice log message, permission is denied)
  2. Open terminal and run the following command:
 adb shell pm grant com.jaredrummler.usagestatsperm android.permission.PACKAGE_USAGE_STATS
  1. Re-open the app (log message now prints granted)

Log:

D/MainActivity: mode: 3, granted = true, usageStatsSize: 16246

<?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="com.jaredrummler.usagestatsperm">
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.jaredrummler.usagestatsperm"
minSdkVersion 23
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
import android.Manifest.permission.PACKAGE_USAGE_STATS
import android.app.AppOpsManager
import android.app.usage.UsageStatsManager
import android.content.Context
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import java.util.Calendar
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appOps = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
val mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), packageName)
val granted: Boolean
if (mode == AppOpsManager.MODE_DEFAULT) {
granted = (checkCallingOrSelfPermission(PACKAGE_USAGE_STATS) == PERMISSION_GRANTED)
} else {
granted = (mode == AppOpsManager.MODE_ALLOWED);
}
val usm = getSystemService(USAGE_STATS_SERVICE) as UsageStatsManager
val calendar = Calendar.getInstance()
val toTime = calendar.timeInMillis
calendar.add(Calendar.YEAR, -1)
val fromTime = calendar.timeInMillis
val queryUsageStats = usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, fromTime, toTime)
Log.d("MainActivity", "mode: $mode, granted = $granted, usageStatsSize: ${queryUsageStats.size}")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment