прикрепите вывод 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()
}
}
Код: Выделить всё
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")
}
}
Код: Выделить всё
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
Подробнее здесь: https://stackoverflow.com/questions/790 ... yexception
Мобильная версия