我已经创建了一个设备所有者应用程序,但我在一个真正的设备上安装它有困难。我正在使用给定这里的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": {
}
}通过这样做,我从Android生成了我的apk :构建->、生成签名的Apk->创建一个新的keystore -> Ok -> Next-> SelectRelease-> Build。然后使用以下方法创建包校验和
cat /mnt/c/Users/Antarpuneet/app-Relase.apk\ openssl -binary -sha256 base64 openssl '+/‘’_ 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 shell dpm set-设备所有者com.example.kit应用程序/..DevAdminReceiver
它成功地将应用程序设置为设备所有者。
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“不接受谷歌驱动链接(或长链接),我的应用程序甚至没有被下载。所以,我现在把我的应用程序托管在一个免费的文件托管网站上,现在它正在被下载(我可以从那个网站确认)..Also,没有问题的校验和,因为我尝试给它错误的,它返回了一个校验和错误。现在,我的应用程序正在下载,但是在安装时,它说被Play 阻止了,而且当我点击安装时,它会返回旧的错误:无法设置设备-无法安装管理应用
发布于 2020-08-11 17:08:32
经过大量的工厂重置后,我能够解决我的问题。首先,确保您在QR代码中提供到此属性"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION“的链接。
不应该是谷歌的驱动器链接。为了进行测试,你可以在一个免费网站上托管你的应用程序,给你一个简短的链接。
完成此操作后,我的应用程序已成功下载,但仍未能安装。我发现了这个问题,这就是我的报表中的android:testOnly="true"属性。我将其设置为false,它正常工作。不过,奇怪的是,我所读的所有帮助我创建这个设备所有者应用程序的博客都明确要求这个属性为真。
https://stackoverflow.com/questions/63241934
复制相似问题