Приложение в режиме киоска завершается с ошибкой SecurityExceptionJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Приложение в режиме киоска завершается с ошибкой SecurityException

Сообщение Anonymous »

При запуске приложения на Android оно вылетает и показывает, что произошла ошибка.
прикрепите вывод Logcat и код из 2 файлов
  • MainActivity:

Код: Выделить всё

package pl.mrugacz95.kiosk

import android.app.PendingIntent
import android.app.PendingIntent.FLAG_IMMUTABLE
import android.app.admin.DevicePolicyManager
import android.app.admin.SystemUpdatePolicy
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.IntentSender
import android.content.pm.PackageInstaller
import android.content.pm.PackageInstaller.SessionParams
import android.os.BatteryManager
import android.os.Bundle
import android.os.UserManager
import android.provider.Settings
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.snackbar.Snackbar
import pl.mrugacz95.kiosk.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

private lateinit var mAdminComponentName: ComponentName
private lateinit var mDevicePolicyManager: DevicePolicyManager
private lateinit var binding: ActivityMainBinding

companion object {
const val LOCK_ACTIVITY_KEY = "pl.mrugacz95.kiosk.MainActivity"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

mAdminComponentName = MyDeviceAdminReceiver.getComponentName(this)
mDevicePolicyManager = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager

mDevicePolicyManager.removeActiveAdmin(mAdminComponentName)

val isAdmin = isAdmin()
if (isAdmin) {
Snackbar.make(binding.content, R.string.device_owner, Snackbar.LENGTH_SHORT).show()
} else {
Snackbar.make(binding.content, R.string.not_device_owner, Snackbar.LENGTH_SHORT).show()
}
binding.btStartLockTask.setOnClickListener {
setKioskPolicies(true, isAdmin)
}
binding.btStopLockTask.setOnClickListener {
setKioskPolicies(false, isAdmin)
val intent = Intent(applicationContext, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
intent.putExtra(LOCK_ACTIVITY_KEY, false)
startActivity(intent)
}
binding.btInstallApp.setOnClickListener {
installApp()
}
}

private fun isAdmin() = mDevicePolicyManager.isDeviceOwnerApp(packageName)

private fun setKioskPolicies(enable: Boolean, isAdmin: Boolean) {
if (isAdmin) {
setRestrictions(enable)
enableStayOnWhilePluggedIn(enable)
setUpdatePolicy(enable)
setAsHomeApp(enable)
setKeyGuardEnabled(enable)
}
setLockTask(enable, isAdmin)
setImmersiveMode(enable)
}

// region restrictions
private fun setRestrictions(disallow: Boolean) {
setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, disallow)
setUserRestriction(UserManager.DISALLOW_FACTORY_RESET, disallow)
setUserRestriction(UserManager.DISALLOW_ADD_USER, disallow)
setUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, disallow)
setUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, disallow)
mDevicePolicyManager.setStatusBarDisabled(mAdminComponentName, disallow)
}

private fun setUserRestriction(restriction: String, disallow: Boolean) = if (disallow) {
mDevicePolicyManager.addUserRestriction(mAdminComponentName, restriction)
} else {
mDevicePolicyManager.clearUserRestriction(mAdminComponentName, restriction)
}
// endregion

private fun enableStayOnWhilePluggedIn(active: Boolean) = if (active) {
mDevicePolicyManager.setGlobalSetting(
mAdminComponentName,
Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
(BatteryManager.BATTERY_PLUGGED_AC
or BatteryManager.BATTERY_PLUGGED_USB
or BatteryManager.BATTERY_PLUGGED_WIRELESS).toString()
)
} else {
mDevicePolicyManager.setGlobalSetting(mAdminComponentName, Settings.Global.STAY_ON_WHILE_PLUGGED_IN, "0")
}

private fun setLockTask(start: Boolean, isAdmin:  Boolean) {
if (isAdmin) {
mDevicePolicyManager.setLockTaskPackages(
mAdminComponentName, if (start) arrayOf(packageName) else arrayOf()
)
}
if (start) {
startLockTask()
} else {
stopLockTask()
}
}

private fun setUpdatePolicy(enable: Boolean) {
if (enable) {
mDevicePolicyManager.setSystemUpdatePolicy(
mAdminComponentName,
SystemUpdatePolicy.createWindowedInstallPolicy(60, 120)
)
} else {
mDevicePolicyManager.setSystemUpdatePolicy(mAdminComponentName, null)
}
}

private fun setAsHomeApp(enable: Boolean) {
if (enable) {
val intentFilter = IntentFilter(Intent.ACTION_MAIN).apply {
addCategory(Intent.CATEGORY_HOME)
addCategory(Intent.CATEGORY_DEFAULT)
}
mDevicePolicyManager.addPersistentPreferredActivity(
mAdminComponentName, intentFilter, ComponentName(packageName, MainActivity::class.java.name)
)
} else {
mDevicePolicyManager.clearPackagePersistentPreferredActivities(
mAdminComponentName, packageName
)
}
}

private fun setKeyGuardEnabled(enable: Boolean) {
mDevicePolicyManager.setKeyguardDisabled(mAdminComponentName, !enable)
}

@Suppress("DEPRECATION")
private fun setImmersiveMode(enable: Boolean) {
if (enable) {
val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
window.decorView.systemUiVisibility = flags
} else {
val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
window.decorView.systemUiVisibility = flags
}
}

private fun createIntentSender(context: Context?, sessionId: Int, packageName: String?): IntentSender {
val intent = Intent("INSTALL_COMPLETE")
if (packageName != null) {
intent.putExtra("PACKAGE_NAME", packageName)
}
val pendingIntent = PendingIntent.getBroadcast(
context,
sessionId,
intent,
FLAG_IMMUTABLE
)
return pendingIntent.intentSender
}

private fun installApp() {
if (!isAdmin()) {
Snackbar.make(binding.content, R.string.not_device_owner, Snackbar.LENGTH_LONG).show()
return
}
val raw = resources.openRawResource(R.raw.other_app)
val packageInstaller: PackageInstaller = packageManager.packageInstaller
val params = SessionParams(SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName("com.mrugas.smallapp")
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)
val out = session.openWrite("SmallApp", 0, -1)
val buffer = ByteArray(65536)
var c: Int
while (raw.read(buffer).also { c = it } != -1) {
out.write(buffer, 0, c)
}
session.fsync(out)
out.close()
createIntentSender(this, sessionId, packageName).let { intentSender ->
session.commit(intentSender)
}
session.close()
}
}

И код «MyDeviceAdminReciever»:

Код: Выделить всё

package pl.mrugacz95.kiosk

import android.app.admin.DeviceAdminReceiver
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.util.Log

class MyDeviceAdminReceiver : DeviceAdminReceiver() {
companion object {
fun getComponentName(context: Context): ComponentName {
return ComponentName(context.applicationContext, MyDeviceAdminReceiver::class.java)
}

private val TAG = MyDeviceAdminReceiver::class.java.simpleName
}

override fun onLockTaskModeEntering(context: Context, intent:  Intent, pkg: String) {
super.onLockTaskModeEntering(context, intent, pkg)
Log.d(TAG, "onLockTaskModeEntering")
}

override fun onLockTaskModeExiting(context: Context, intent: Intent) {
super.onLockTaskModeExiting(context, intent)
Log.d(TAG, "onLockTaskModeExiting")
}
}

Вывод Logcat:

Код: Выделить всё

2024-10-02 15:39:53.897  4511-4511  AndroidRuntime          pl.mrugacz95.kiosk                   E  FATAL EXCEPTION: main
Process: pl.mrugacz95.kiosk, PID: 4511
java.lang.RuntimeException: Unable to start activity ComponentInfo{pl.mrugacz95.kiosk/pl.mrugacz95.kiosk.MainActivity}: java.lang.SecurityException: Admin ComponentInfo{pl.mrugacz95.kiosk/pl.mrugacz95.kiosk.MyDeviceAdminReceiver} does not exist or is not owned by uid 10198
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3843)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3980)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2440)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:8197)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1019)
Caused by: java.lang.SecurityException: Admin ComponentInfo{pl.mrugacz95.kiosk/pl.mrugacz95.kiosk.MyDeviceAdminReceiver} does not exist or is not owned by uid 10198
at android.os.Parcel.createExceptionOrNull(Parcel.java:3011)
at android.os.Parcel.createException(Parcel.java:2995)
at android.os.Parcel.readException(Parcel.java:2978)
at android.os.Parcel.readException(Parcel.java:2920)
at android.app.admin.IDevicePolicyManager$Stub$Proxy.removeActiveAdmin(IDevicePolicyManager.java:7361)
at android.app.admin.DevicePolicyManager.removeActiveAdmin(DevicePolicyManager.java:4077)
at pl.mrugacz95.kiosk.MainActivity.onCreate(MainActivity.kt:41)
at android.app.Activity.performCreate(Activity.java:8340)
at android.app.Activity.performCreate(Activity.java:8319)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3824)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3980) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2440) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:201) 
at android.os.Looper.loop(Looper.java:288) 
at android.app.ActivityThread.main(ActivityThread.java:8197) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1019) 
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.devicepolicy.DevicePolicyManagerService.getCallerIdentity(DevicePolicyManagerService.java:2053)
at com.android.server.devicepolicy.DevicePolicyManagerService.getCallerIdentity(DevicePolicyManagerService.java:2024)
at com.android.server.devicepolicy.DevicePolicyManagerService.removeActiveAdmin(DevicePolicyManagerService.java:3704)
at android.app.admin.IDevicePolicyManager$Stub.onTransact(IDevicePolicyManager.java:3424)
at android.os.Binder.execTransactInternal(Binder.java:1286)
2024-10-02 17:04:25.490 16939-16939 Process                 pl.mrugacz95.kiosk                   D  call killProcess from uid 10198 pid 16939 tid 16939 to kill pid 16939
java.lang.Exception:  log killProcess callstack for debug:
at android.os.Process.killProcess(Process.java:1332)
at com.android.internal.os.RuntimeInit$KillApplicationHandler.uncaughtException(RuntimeInit.java:195)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1073)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
at java.lang.Thread.dispatchUncaughtException(Thread.java:2306)
2024-10-02 17:04:25.490 16939-16939 Process                 pl.mrugacz95.kiosk                   I  Sending signal. PID: 16939 SIG: 9
2024-10-02 17:04:25.493  3344-3429  ModelWriter             com.tblenovo.launcher                E  item: WorkspaceItemInfo(id=39 type=APP container=# com.android.launcher3.logger.LauncherAtom$ContainerInfo@7bc6f targetComponent=ComponentInfo{pl.mrugacz95.kiosk/pl.mrugacz95.kiosk.MainActivity} screen=0 cell(1,0) span(1,1) minSpan(1,1) rank=0 user=UserHandle{0} title=Kiosk demo) container being set to: -201, not in the list of folders

При запуске приложения на Android оно вылетает и показывает, что произошла ошибка.

Подробнее здесь: https://stackoverflow.com/questions/790 ... yexception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»