Android “无法设置设备-无法安装管理员应用”-设置设备所有者应用的二维码时出错

Android “无法设置设备-无法安装管理员应用”-设置设备所有者应用的二维码时出错,android,kotlin,qr-code,device-owner,Android,Kotlin,Qr Code,Device Owner,我创建了一个设备所有者应用程序,但在实际设备上安装时遇到问题。我正在使用给定的二维码方法 我用来创建二维码的文本是 { "android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME": "com.example.killapplication/com.example.killapplication.DevAdminReceiver", "android.app.extra.PROVIS

我创建了一个设备所有者应用程序,但在实际设备上安装时遇到问题。我正在使用给定的二维码方法

我用来创建二维码的文本是

{

"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:构建->生成签名的apk->创建新密钥库->确定->下一步->选择发布->构建。 然后我使用

cat/mnt/c/Users/antarpunet/app-release.apk | openssl dgst-二进制 -sha256 | openssl base64 | tr'+/''-|'| tr-d'='

在完成工厂重置后,在欢迎屏幕上点击6次,打开一个QR阅读器应用程序,我扫描代码,然后进入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)

    }
}
目前,该应用程序做的不多,只会根据设备所有者权限是否已授予该应用程序而给出“是”或“否”的祝酒词

我的清单文件:-

<?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外壳dpm集设备所有者 com.example.killapplication/.DevAdminReceiver

它成功地将应用程序设置为设备所有者

在工厂重置并跳过登录后,在真实设备上安装应用程序 页面使用上面的adb命令。 它成功地将应用程序设置为设备所有者。我认为这意味着 问题是二维码。 3.使用: android.app.extra.PROVISIONING\u DEVICE\u ADMIN\u签名\u校验和而不是 android.app.extra.PROVISIONING\u DEVICE\u ADMIN\u PACKAGE\u CHECKSUM, 它返回相同的错误

我正在尝试将它安装在Android版本9的设备上

更新:我发现android.app.extra.PROVISIONING\u DEVICE\u ADMIN\u PACKAGE\u DOWNLOAD\u LOCATION 不接受谷歌硬盘链接或长链接,我的应用甚至没有被下载。所以,我现在已经在一个免费的文件托管网站上托管了我的应用程序,现在它正在下载。我可以从该网站确认。而且,校验和没有问题,因为我尝试给它错误的,它返回了 校验和错误。 现在,我的应用程序正在下载,但在安装时,它显示已被Play Protect阻止,当我点击Install(安装)时,它返回旧错误:
无法设置设备-无法安装管理员应用程序经过多次工厂重置后,我能够解决我的问题。 首先,确保您在二维码中提供的链接指向此属性 android.app.extra.PROVISIONING\u设备\u管理\u软件包\u下载\u位置

不应该是谷歌驱动器链接。为了进行测试,你可以在一个文件托管免费网站上托管你的应用程序,该网站会给你一个短链接


完成此操作后,我的应用程序已成功下载,但仍无法安装。我发现了问题所在,这就是我清单中的android:testOnly=true属性。我将其设置为false,它工作正常。奇怪的是,我读到的所有帮助我创建这个设备所有者应用程序的博客都明确要求这个属性为真。

在多次工厂重置后,我能够解决我的问题。 首先,确保您在二维码中提供的链接指向此属性 android.app.extra.PROVISIONING\u设备\u管理\u软件包\u下载\u位置

不应该是谷歌驱动器链接。为了进行测试,你可以在一个文件托管免费网站上托管你的应用程序,该网站会给你一个短链接

完成此操作后,我的应用程序已成功下载,但仍无法安装。我发现了问题所在,这就是我清单中的android:testOnly=true属性。我将其设置为false,它工作正常。奇怪的是,我读到的所有帮助我创建这个设备所有者应用程序的博客都明确要求这个属性为真