【发布时间】:2020-11-24 06:11:11
【问题描述】:
我创建了一个设备所有者应用程序,但在真实设备上安装它时遇到问题。我正在使用here给出的二维码方法。
我用来创建二维码的文本是
{
"android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME":
"com.example.killapplication/com.example.killapplication.DevAdminReceiver",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM":
"JdySYN-hMYsxWKagMxbk5q8Giu4lCCsUpQayMMKpwK0",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION":
"https://drive.google.com/u/0/uc?id=13O35_iCUcHVqNcuOvnRM5-sc8G586Xgf&export=download",
"android.app.extra.PROVISIONING_TIME_ZONE":
"America/Los_Angeles",
"android.app.extra.PROVISIONING_SKIP_ENCRYPTION": false,
"android.app.extra.PROVISIONING_ADMIN_EXTRAS_BUNDLE": {
}
}
我通过执行以下操作从 Android Studio 生成我的 apk:Build -> Generate Signed Apk-> Create a new keystore -> Ok -> Next-> Select "Release"-> Build. 然后我使用
创建包校验和cat /mnt/c/Users/Antarpuneet/app-release.apk | openssl dgst -二进制 -sha256 | openssl base64 | tr '+/' '-_' | tr -d '='
恢复出厂设置后,在欢迎界面点击6次打开二维码阅读器应用,我扫码进入WIFI连接界面,成功连接互联网。它说正在设置设备.. 但返回错误 无法设置设备- 无法安装管理应用程序。 这是我的 DevAdminReceiver 类:-
package com.example.killapplication
import android.app.admin.DeviceAdminReceiver
import android.content.ComponentName
import android.content.ContentValues.TAG
import android.content.Context
import android.content.Intent
import android.util.Log
import android.widget.Toast
class DevAdminReceiver: DeviceAdminReceiver() {
override fun onEnabled(context: Context?, intent: Intent?) {
super.onEnabled(context, intent)
Log.d(TAG, "Device Owner Enabled")
Toast.makeText(context, "Device Owner Enabled", Toast.LENGTH_SHORT).show();
}
companion object {
fun getComponentName(context: Context): ComponentName {
return ComponentName(context.applicationContext, DevAdminReceiver::class.java)
}
}
}
我的主要活动:-
package com.example.killapplication
import android.Manifest
import android.app.admin.DevicePolicyManager
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
class MainActivity : AppCompatActivity() {
var button: Button? = null
private lateinit var mAdminComponentName: ComponentName
fun onClick(view: View?) {
mAdminComponentName = DevAdminReceiver.getComponentName(this)
val devicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
if (devicePolicyManager.isDeviceOwnerApp("com.example.killapplication")) {
Toast.makeText(this, "YES", Toast.LENGTH_SHORT).show()
Log.i("Status", "Yes")
} else {
Toast.makeText(this, "NO", Toast.LENGTH_SHORT).show()
Log.i("Status", "No")
}
//devicePolicyManager.reboot( mAdminComponentName)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
目前,该应用程序并没有做太多事情,只是根据设备所有者权限是否已授予该应用程序而给予祝酒Yes 或 No。
我的清单文件:-
<?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.example.killapplication">
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<permission android:name="android.permission.REBOOT"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<application
android:allowBackup="true"
android:sharedUserId="android.uid.system"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:testOnly="true">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".DevAdminReceiver"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
</receiver>
</application>
</manifest>
device_admin.xml :-
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
<expire-password />
<encrypted-storage />
<disable-camera />
<disable-keyguard-features />
</uses-policies>
</device-admin>
我已经尝试过的:
- 使用 adb shell 命令在模拟器上安装应用程序
adb shell dpm set-device-owner com.example.killapplication/.DevAdminReceiver
它成功地将应用设置为设备所有者。
- 在真机上安装应用(恢复出厂设置跳过登录后) 页)使用上面的 adb 命令。 它成功地将应用程序设置为设备所有者。我认为这意味着 二维码有问题。
3.使用: android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM 而不是 android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, 它返回相同的错误。
我正在尝试将其安装在 Android 版本 9 的设备上。
更新:我发现“android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION” 不接受谷歌驱动链接(或长链接),我的应用程序甚至没有被下载。所以,我现在已经在一个免费的文件托管网站上托管了我的应用程序,现在它正在被下载(我可以从那个网站确认)..另外,校验和没有问题,因为我尝试给它错误的,它返回了 校验和错误。 现在,我的应用程序正在下载,但在安装时,它显示 被 Play Protect 阻止,当我点击 Install Anyway 时,它返回旧错误: 无法设置设备 - 无法安装管理应用
【问题讨论】:
标签: android kotlin qr-code device-owner