kotlin “无法设置设备-无法安装管理员应用程序”-设置设备所有者应用程序的QR码时出错

ih99xse1  于 2023-06-24  发布在  Kotlin
关注(0)|答案(2)|浏览(172)

我已经创建了一个设备所有者应用程序,但我在实际设备上安装它时遇到了麻烦。我正在使用这里给出的QR Code方法。
我用来创建QR码的文本是

{

"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-binary-sha256| openssl base64|中文(简体)|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>

我已经尝试过的:
1.使用adb shell命令在Emulator上安装应用程序
adb shell dpm set-device-owner com. example. killapplication/. DevAdminReceiver
它已成功将应用设置为设备所有者。
1.使用上面的adb命令在真实设备上安装应用程序(恢复出厂设置并跳过登录页面后)。它成功将应用程序设置为设备所有者。我认为这意味着问题出在QR码上。
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阻止,当我点击 * 无论如何安装 * 时,它返回旧错误:
* 无法设置设备-无法安装管理应用**

flvtvl50

flvtvl501#

经过大量的工厂重置,我能够解决我的问题。首先,请确保您在QR码中提供的链接指向此属性 “android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION”
不应该是Google Drive链接。为了测试,你可以在一个免费的文件托管网站上托管你的应用程序,该网站会给你一个简短的链接。
这样做后,我的应用程序下载成功,但仍然无法安装。我找到了问题所在,是Manifest中的android:testOnly=“true”属性。我把它设置为false,它工作正常。奇怪的是,因为我读到的所有帮助我创建这个设备所有者应用程序的博客都特别要求这个属性为真。

ohfgkhjo

ohfgkhjo2#

确保您尝试管理的设备的系统为最新。这解决了我的问题。

相关问题