16

現在、定期的IllegalArgumentExceptionに を呼び出すとが発生するという問題がありますActivity.startLockTask()。アプリにデバイス オーナー アプリがインストールされているため、パッケージが自動的に固定されます。

以下のコードは、パッケージが自分自身をロックできることを確認しています。可能であれば、それ自体を固定します。

コード:

if (dpm.isLockTaskPermitted(getPackageName())) {
    super.startLockTask();
}

ログキャット:

java.lang.IllegalArgumentException: Invalid task, not in foreground
    at android.os.Parcel.readException(Parcel.java:1544)
    at android.os.Parcel.readException(Parcel.java:1493)
    at android.app.ActivityManagerProxy.startLockTaskMode(ActivityManagerNative.java:5223)
    at android.app.Activity.startLockTask(Activity.java:6163)

問題は、アプリが時々再起動する必要があることです。そのため、固定を解除し、アクティビティを終了して、新しいタスクで再度開始し、プロセスを終了します。アクティビティが戻ってくると、自分自身をピン留めしようとします。うまくいくこともあれば、うまくいかないこともあります。再起動の方法がおそらく例外がスローされる理由だと思いますが、新しいアクティビティがフォアグラウンドにあり、フォーカスされているため、問題にはなりません。

アクティビティがピン留めに失敗すると、試みている限り失敗し続けます。そこに座って 5 秒ごとにタスクをピン留めしようとすると、毎回失敗し続けます。onCreateonWindowFocusChangedonResume、および で固定しようとしましたonStart

問題が何であるかを知っている人はいますか?

参考までに:
行 8853: https://android.googlesource.com/platform/frameworks/base/+/android-5.0.2_r1/services/core/java/com/android/server/am/ActivityManagerService.java

4

6 に答える 6

8

私は同じ問題を抱えていますが、まだ適切な解決策を見つけていません。しかし、これは私が現在していることです。

Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        try {
            if (dpm.isLockTaskPermitted(getPackageName())) {
                super.startLockTask();
            }
        }catch (Exception exception) {
            Log.v("KioskActivity","startLockTask - Invalid task, not in foreground");
        }
    }
},1500);

onWindowFocusChanged が起動されても、ロックを要求しているアプリケーションはまだフォーカスを受け取っていないようです。startLocktask の呼び出しを少し遅らせることで、機能します。アプリが固定/ロックされないわずかな期間があります。私はいくつかの追加のセキュリティ対策によってこれを解決しました (バックグラウンドで長時間実行されているサービスがあり、通知シェードのプルダウンを防ぎ、開いている場合は設定ウィンドウを閉じます)。

ところで、これを適切な方法で解決できたことがありますか?

于 2016-07-27T07:25:57.763 に答える
0

キオスク モード用に別のアクティビティを作成しました

主なアイデアは、このタスクを他のアクティビティから配信し、ロック タスクを常にスタックのルートに保持することです。

View.post(...)魔法の遅延と同様に、私には機能しません

onResume()チェック付きのメソッドはisFinishing()正常に動作しますが、クリアタスクフラグには注意してください

<style name="AppTheme.Transparent" parent="android:style/Theme.Translucent.NoTitleBar.Fullscreen">
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:colorAccent">@color/colorAccent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>
class LockActivity : Activity() {

    private lateinit var adminManager: AdminManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        adminManager = AdminManager(applicationContext)
    }

    override fun onStart() {
        super.onStart()
        when (activityManager.lockTaskModeState) {
            ActivityManager.LOCK_TASK_MODE_NONE -> {
                if (true/*IT IS NEEDED*/) {
                    if (adminManager.setKioskMode(true)) {
                        // need startLockTask on resume
                        return
                    } else {
                        //toast("HAVE NO OWNER RIGHTS")
                    }
                }
                launchActivity()
                finish()
            }
            ActivityManager.LOCK_TASK_MODE_LOCKED -> {
                if (false/*IT IS NOT NEEDED*/) {
                    if (adminManager.setKioskMode(false)) {
                        stopLockTask()
                        launchActivity()
                        finish()
                        return
                    } else {
                        //toast("HAVE NO OWNER RIGHTS")
                    }
                }
                launchActivity()
            }
            else -> finishAffinity()
        }
    }

    override fun onResume() {
        super.onResume()
        if (!isFinishing) {
            if (activityManager.lockTaskModeState == ActivityManager.LOCK_TASK_MODE_NONE) {
                startLockTask()
                launchActivity()
            }
        }
    }

    private fun launchActivity() {
        // todo startActivity depending on business logic
    }

    override fun onBackPressed() {}
}
class AdminManager(context: Context) {

    private val adminComponent = ComponentName(context, AdminReceiver::class.java)

    private val deviceManager = context.devicePolicyManager

    private val packageName = context.packageName

    @Suppress("unused")
    val isAdmin: Boolean
        get() = deviceManager.isAdminActive(adminComponent)

    val isDeviceOwner: Boolean
        get() = deviceManager.isDeviceOwnerApp(packageName)

    fun setKioskMode(enable: Boolean): Boolean {
        if (isDeviceOwner) {
            setRestrictions(enable)
            deviceManager.setKeyguardDisabled(adminComponent, enable)
            setLockTask(enable)
            return true
        }
        return false
    }

    /**
     * @throws SecurityException if {@code admin} is not a device or profile owner.
     */
    private fun setRestrictions(enable: Boolean) {
        arrayOf(
            UserManager.DISALLOW_FACTORY_RESET,
            UserManager.DISALLOW_SAFE_BOOT,
            UserManager.DISALLOW_ADD_USER
        ).forEach {
            if (enable) {
                deviceManager.addUserRestriction(adminComponent, it)
            } else {
                deviceManager.clearUserRestriction(adminComponent, it)
            }
        }
    }

    /**
     * @throws SecurityException if {@code admin} is not the device owner, the profile owner of an
     * affiliated user or profile, or the profile owner when no device owner is set.
     */
    private fun setLockTask(enable: Boolean) {
        if (enable) {
            deviceManager.setLockTaskPackages(adminComponent, arrayOf(packageName))
        } else {
            deviceManager.setLockTaskPackages(adminComponent, arrayOf())
        }
    }
}
于 2019-10-08T08:56:18.650 に答える