Не удается настроить устройство - Не удалось установить приложение администратора - Ошибка при предоставлении QR-кода приложения владельца устройства

Я создал приложение для владельца устройства, но у меня возникают проблемы с его установкой на реальном устройстве. Я использую метод QR-кода, указанный здесь .

Текст, который я использую для создания своего 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": {
}

}

Я генерирую свой apk из студии Android, выполнив следующие действия: Build - ›Generate Signed Apk-› Create a new keystore - ›Ok -› Next- ›Select Release-› Build. Затем я создаю контрольную сумму пакета, используя

кот /mnt/c/Users/Antarpuneet/app-release.apk | openssl dgst -binary -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>

Что я уже пробовал:

  1. Установка приложения на эмулятор с помощью команды оболочки adb

оболочка adb 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 не принимает ссылки на диски Google (или длинные ссылки), и мое приложение даже не загружалось. Итак, я разместил свое приложение на бесплатном веб-сайте хостинга файлов, и теперь оно загружается (я могу подтвердить с этого веб-сайта) .. Кроме того, нет проблем с контрольной суммой, потому что я пытался указать неправильные, и оно вернулось с ошибка контрольной суммы. Сейчас мое приложение загружается, но при установке отображается сообщение Заблокировано Play Protect, и когда я нажимаю Все равно установить, оно возвращается со старой ошибкой: Может не настроил устройство - не удалось установить приложение администратора


person Antarpuneet Singh    schedule 04.08.2020    source источник


Ответы (1)


После множества заводских сбросов я смог решить свою проблему. Прежде всего, убедитесь, что указанная вами в QR-коде ссылка на этот атрибут android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION

не должна быть ссылка на Google Диск. Для тестирования вы можете разместить свое приложение на бесплатном веб-сайте с файловым хостингом, который даст вам короткую ссылку.

После этого мое приложение было успешно загружено, но все равно не удалось установить. Я выяснил, в чем проблема, и это был атрибут android: testOnly = true в моем манифесте. Я установил для него значение false, и он работал правильно. Это странно, потому что все блоги, которые я читал, которые помогли мне создать это приложение для владельца устройства, специально указали, что этот атрибут является истинным.

person Antarpuneet Singh    schedule 11.08.2020