似乎已经在API 21(Lollipop)中添加了PackageInstaller(https://developer.android.com/reference/android/content/pm/PackageInstaller.html),但是我还没有找到任何关于如何安装的可靠代码示例通过此API的APK.任何代码帮助将不胜感激.
我正在调查针对Android M Preview的COSU/Kiosk应用程序,并且正在尝试实施新功能"设备所有者静默安装和卸载应用程序"(https://developer.android.com/preview/api-overview.html# afw)通过PackageInstaller API.
找到这些,但没有帮助:如何使用Android L中的"PackageInstaller"类安装/更新/删除APK? Lollipop上的"PackageInstaller"类是什么,以及如何使用它?
没有找到任何Android示例应用程序.
提前致谢.
silent-installer kiosk-mode device-owner packageinstaller android-6.0-marshmallow
在实现设备所有权之后,我试图实现一种方法来指示设备将任何给定的应用程序锁定到信息亭模式(或屏幕固定模式).由于我拥有设备所有权,因此不会要求用户获得许可.
在开发者网站上,简要说明告诉我可以做我正在尝试的事情:
http://developer.android.com/about/versions/android-5.0.html#ScreenPinning
以编程方式:要以编程方式激活屏幕固定,请从您的应用程序调用startLockTask().如果请求的应用程序不是设备所有者,则会提示用户进行确认.设备所有者应用程序可以调用setLockTaskPackages()方法,以便在没有用户确认步骤的情况下使应用程序可以固定.
这表明作为设备所有者应用程序,我可以在没有用户确认的情况下锁定其他应用程序...但我不知道如何操作.
我已经能够将自己的应用程序置于固定模式.
任何帮助,将不胜感激.
android device-policy-manager android-5.0-lollipop android-screen-pinning device-owner
我按照本教程将应用程序设置为设备所有者.在该教程中,有一节"使用adb设置设备所有者".这里的教程说明在安装Kiosk模式演示应用程序后,运行以下命令:
adb shell dpm set-device-owner sdg.example.kiosk_mode/.AdminReceiver
Run Code Online (Sandbox Code Playgroud)
这给了我错误:
adb server is out of date. killing...
* daemon started successfully *
java.lang.IllegalStateException: Not allowed to set the device owner because there are already several users on the device
at android.os.Parcel.readException(Parcel.java:1629)
at android.os.Parcel.readException(Parcel.java:1574)
at android.app.admin.IDevicePolicyManager$Stub$Proxy.setDeviceOwner(IDevicePolicyManager.java:5146)
at com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:114)
at com.android.commands.dpm.Dpm.onRun(Dpm.java:82)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
at com.android.commands.dpm.Dpm.main(Dpm.java:38)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:257)
Run Code Online (Sandbox Code Playgroud)
我按照这个SO链接,Diego Plascencia Lara的答案帮助我摆脱了
adb server is out of date. killing...
* daemon started successfully *
Run Code Online (Sandbox Code Playgroud)
但运行adb shell dpm set-device-owner sdg.example.kiosk_mode/.AdminReceiver …
我有一个应用程序将自己注册为默认启动器并在启动时自动固定.
安装应用程序时一切正常.它自己固定,只有后退按钮可见.
问题是当设备首次启动时,它无法正确固定.我多次看到一系列祝酒词"Screen pinned"和"Screen unpinned"."主页"和"近期任务"按钮仍然可见.
-
运行"adb shell dumpsys活动活动" - 最后一行表示它没有固定:
mLockTaskModeState=NONE mLockTaskPackages (userId:packages)=
0:[com.example.myapp]
mLockTaskModeTasks[]
Run Code Online (Sandbox Code Playgroud)
-
测试设备华硕ZenPad运行Marshmallow/6.0/23
我依靠MainActivity清单属性"lockTaskMode"来固定(而不是activity.startLockTask()):
<activity
android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/launcher_main"
android:launchMode="singleTask"
android:lockTaskMode="if_whitelisted"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
任何帮助或指示将不胜感激
我想将我的应用程序作为设备所有者安装在Android TV Box上,但出现下一个异常。
adb shell dpm set-device-owner
"com.android.testapp/.receivers.AdminReceiver"
java.lang.RuntimeException: Can't set package com.android.testapp as
device owner.
at com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:115)
at com.android.commands.dpm.Dpm.onRun(Dpm.java:82)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
at com.android.commands.dpm.Dpm.main(Dpm.java:38)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:251)
Run Code Online (Sandbox Code Playgroud)
设备上没有帐户。它可以在我的手机上使用,但不能在Android TV Box上使用。
使用 Android 设备所有者 API 可以重新启动设备(https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#reboot(android.content.ComponentName)),这对我来说是许可明智的做法与关闭设备几乎相同。
我仍然找不到任何提及作为设备所有者以编程方式关闭设备的可能性。今天在没有root的情况下有可能吗?
有一些老问题在讨论这个,但从那时起,Android 发生了很多变化,当时无法在没有 root fe 的情况下重新启动,所以我希望现在也可以完全关闭。
首先,如果这是一个不适合这个问题的地方,请道歉,因为它不是严格的代码问题,但我在其他地方努力寻找任何相关资源.
我们的解决方案基于使用三星设备(目前为S7s)作为完全受管理的设备,其应用程序注册为"设备所有者",然后管理该产品所需的一些其他文件和应用程序.在工厂重置之后,通过运行自定义应用程序的另一部电话生成NFC消息,通过NFC将其提供给设备.
这些都是独立于任何MDM或EMM系统完成的,设备所有者应用程序由我们的封闭网络上的服务器提供,并且它全部由本机android功能处理,而不是完全涉及knox.
这最初是在运行Android 6.0和Knox 2.7的S7上开发的,并且运行良好.
但是,我们目前正在设置一个复制系统,理想情况下需要与之前的功能完全相同,但我们现在订购的设备配备Android版本8.0和Knox 3.1,这似乎是一些问题的根源.
在第一次尝试通过NFC配置设备之前,过程成功并且设备所有者设置成功,似乎没有任何问题.
然后,当设备出厂时重置以再次测试该过程时,在发送NFC消息后,会立即显示弹出窗口:"无法创建工作配置文件""安全策略阻止创建受管设备,因为自定义操作系统是或已安装在此设备上"
这种情况发生在手机甚至试图连接到网络并下载我们的应用程序之前,所以问题不存在.
这款手机是开箱即用的,在最初配置之前从未设置过,因此实际定制固件的部署机会为零,只是为了理智,我确认Knox保修无效位仍然设置为0x0它是谁.
我知道,从Knox 3.0(?)开始,它与内置的android企业功能更加集成,但我认为它仍然可以在没有使用的情况下使用,理想情况下我想避免不必使用任何不必要的Knox SDK积分.如果我需要通过Knox做一些事情以允许此功能,因为目前设备在一次恢复出厂后基本上没用.
如果有人有任何见解为什么会发生这种情况或如何解决它,那将非常感激.
我有一个应用程序,可以通过下面的 JSON 中的 QR 码在 Android 12 及以上的设备上成功设置为设备所有者:
{
"android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME":
"package.CustomDeviceAdminReceiver",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM":
"actual_checksum",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION":
"https://Site/APK_Link",
"android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED": true
}
Run Code Online (Sandbox Code Playgroud)
应用程序包含声明的接收者:
<receiver
android:name=".deviceadmin.CustomDeviceAdminReceiver"
android:description="@string/app_name"
android:label="@string/app_name"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/enterprise_device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
对于 Android 12(如此处所述https://source.android.com/devices/tech/admin/provision),我添加了 2 个活动:
<activity
android:name=".deviceadmin.AdminPolicyComplianceActivity"
android:screenOrientation="portrait"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<action android:name="android.app.action.ADMIN_POLICY_COMPLIANCE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".deviceadmin.ProvisioningModeActivity"
android:screenOrientation="portrait"
android:permission="android.permission.BIND_DEVICE_ADMIN">
<intent-filter>
<action android:name="android.app.action.GET_PROVISIONING_MODE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
第一个:
public class ProvisioningModeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle …Run Code Online (Sandbox Code Playgroud) android provisioning device-policy-manager device-owner android-12
我正在开发一个作为设备所有者运行的应用程序,我想在其中构建一个自动更新程序.
为此,我使用PackageInstaller,因为我拥有使用它的权限,因为我的设备所有者位置.
private void installPackage(InputStream inputStream)
throws IOException {
notifyLog("Inizio aggiornamento...");
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
int sessionId = packageInstaller.createSession(new PackageInstaller
.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL));
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
long sizeBytes = 0;
OutputStream out = null;
out = session.openWrite("my_app_session", 0, sizeBytes);
int total = 0;
byte[] buffer = new byte[65536];
int c;
while ((c = inputStream.read(buffer)) != -1) {
total += c;
out.write(buffer, 0, c);
}
session.fsync(out);
inputStream.close();
out.close();
session.commit(createIntentSender(sessionId));
}
private IntentSender createIntentSender(int sessionId) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
sessionId,
new …Run Code Online (Sandbox Code Playgroud) android android-pendingintent device-owner packageinstaller cosu
device-owner ×10
android ×9
adb ×2
kiosk-mode ×2
nfc ×2
provisioning ×2
android-12 ×1
cosu ×1
java ×1
samsung-knox ×1
updates ×1