【问题标题】:"Can't setup device- Couldn't install the admin app"- Error while QR code provisioning of a Device Owner app“无法设置设备 - 无法安装管理应用程序”- 设备所有者应用程序的 QR 码配置时出错
【发布时间】: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>

我已经尝试过的:

  1. 使用 adb shell 命令在模拟器上安装应用程序

adb shell dpm set-device-owner com.example.killapplication/.DevAdminReceiver

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

  1. 在真机上安装应用(恢复出厂设置跳过登录后) 页)使用上面的 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


    【解决方案1】:

    经过多次恢复出厂设置后,我能够解决我的问题。 首先,确保您在二维码中提供的链接指向该属性 “android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION”

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

    执行此操作后,我的应用程序已成功下载,但仍无法安装。我发现了这个问题,它是我清单中的 android:testOnly="true" 属性。我将它设置为 false 并且它工作正常。不过很奇怪,因为我阅读的所有帮助我创建这个设备所有者应用程序的博客都特别要求这个属性为真。

    【讨论】:

    • 是的,朋友。我知道必须有直接下载链接。我的 Manifest 不包含属性 android:testOnly,但我会尝试设置 android:testOnly="false"
    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2017-05-01
    相关资源
    最近更新 更多