«Не удается настроить устройство - не удалось установить приложение администратора» - ошибка при инициализации QR-кода приложения «Владелец устройства». - PullRequest
1 голос
/ 04 августа 2020

Я создал приложение владельца устройства, но мне не удается установить его на реальном устройстве. Я использую метод 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 studio, выполнив следующие действия: 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 '+ /' '-_' | tr -d '='

После сброса настроек к заводским настройкам, 6-кратное нажатие на экране приветствия открывает приложение для чтения QR-кодов, я сканирую код, а затем попадаю на экран подключения к WIFI. успешно подключиться к Inte rnet. В нем написано «Настройка устройства» ... но возвращается сообщение об ошибке Не удается настроить устройство. Не удалось установить приложение администратора. Это мой класс 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)
        }
    }


}

My Main Действие: -

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

Приложение успешно назначается владельцем устройства.

Установка приложения на реальное устройство (после сброса настроек и пропуска страницы входа) с помощью приведенной выше команды 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 , и когда я нажимаю Все равно установить , оно возвращается со старой ошибкой: Не удается настроить устройство - не удалось установить приложение администратора

1 Ответ

0 голосов
/ 11 августа 2020

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...