デバイス所有者のアクセス許可を持つアプリがあり、別のアプリをサイレント インストールしようとしています。これにはPackageInstaller APIと、アセットフォルダーにあるapkファイルを使用しています。正常に実行されていますが、STATUS_FAILURE とメッセージ INSTALL_FAILED_INTERNAL_ERROR: Permission Denied でインテントを返します。
この回答に従って、 AppInstaller クラスを作成しました。
class AppInstaller {
companion object {
const val ACTION_INSTALL_COMPLETE = "my.package.name.INSTALL_COMPLETE"
}
@Throws(IOException::class)
fun installPackage(context: Context, fileName: String, packageName: String): Boolean {
val input = context.assets.open(fileName)
val packageInstaller = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(packageName)
// set params
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)
val out = session.openWrite("DPC", 0, -1)
val buffer = ByteArray(65536)
var c = input.read(buffer)
while (c != -1) {
out.write(buffer, 0, c)
c = input.read(buffer)
}
session.fsync(out)
input.close()
out.close()
session.commit(createIntentSender(context, sessionId))
return true
}
private fun createIntentSender(context: Context, sessionId: Int): IntentSender {
val pendingIntent = PendingIntent.getBroadcast(context, sessionId, Intent(ACTION_INSTALL_COMPLETE), 0)
return pendingIntent.intentSender
}
}
これらの権限の有無にかかわらず試しました:
<uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.DELETE_PACKAGES" tools:ignore="ProtectedPermissions"/>
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
このコードの結果は真です
dpm.isDeviceOwnerApp("my.package.name")
このaospコードによって、 Android docsで説明されているように:
呼び出し元が次のいずれかのカテゴリに分類されない限り、インストールを完了するためにユーザーの介入が必要になる場合があります。この場合、インストールは自動的に完了します。
デバイス所有者
アフィリエイト プロフィールの所有者
DevicePolicyManager.DELEGATION_PACKAGE_INSTALLATION を持つデバイス所有者委任アプリ
セッションは、新しいアプリをインストールしたり、既存のアプリをアップグレードしたり、既存のアプリに新しい分割を追加したりできます。
だから私は許可を持っている必要があります。
このエラーが発生する理由はありますか? ありがとう。