Я создал приложение для владельца устройства, но у меня возникают проблемы с его установкой на реальном устройстве. Я использую метод 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>
Что я уже пробовал:
- Установка приложения на эмулятор с помощью команды оболочки 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, и когда я нажимаю Все равно установить, оно возвращается со старой ошибкой: Может не настроил устройство - не удалось установить приложение администратора