标签: android-screen-pinning

屏幕以编程方式固定第三方应用

在实现设备所有权之后,我试图实现一种方法来指示设备将任何给定的应用程序锁定到信息亭模式(或屏幕固定模式).由于我拥有设备所有权,因此不会要求用户获得许可.

在开发者网站上,简要说明告诉我可以做我正在尝试的事情:

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

14
推荐指数
1
解决办法
1万
查看次数

Android:如何让设备只运行一个应用程序?

我有一个客户项目,我必须制作单任务Android设备.客户无法逃避我公司开发的应用程序.客户也无法启动任何其他应用程序,并且在启动设备时启动了我们的应用程序.总体而言,所有客户都可以使用该设备运行我们的应用程序.

有没有其他方法来完成这项工作而不是生根设备,禁用所有系统按钮并使我们的应用程序成为启动器.我有400个设备用于此目的,因此根除所有这些将耗费大量时间.

我还阅读了Google有关COSU设备的教程,但发现它非常容易混淆https://developer.android.com/work/cosu.html#testing-plan

机器人自己的屏幕固定不够好,因为客户可以逃脱应用程序.有些人可能会建议使用像SureLock这样的自助服务终端应用程序,但我公司的目标是在不使用任何第三方应用程序的情况下找到明确的解决方案.通过一些信息亭应用程序运行我们的应用程序不是我们的目标.

我在Stack Overflow上发现了一些类似问题的帖子,但不是我正在寻找的答案.

如果有人对这个问题有一些提示,我将非常感激.

android android-screen-pinning cosu

14
推荐指数
2
解决办法
2万
查看次数

如何在屏幕固定时通过NFC发送字符串?

我正在尝试String通过NFC发送,而我的应用程序正在使用屏幕固定.它不起作用:转移不会发生; 但如果我禁用屏幕固定工程的转移String.

我可以禁用屏幕固定一点,然后执行传输,但这是一个安全风险.

我怎样才能做到这一点?


如果您想尝试,这是所有代码.您需要做的就是通过应用程序设置手动启用屏幕固定(因此代码较少,但仍会产生相同的结果).我使用两个运行Android 5.0的Nexus 7测试了这个.

您不必阅读所有这些代码,如果您知道我可以添加到我的清单中的某些内容可以在屏幕固定时允许NFC,则可以解决此问题.


AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidnfc"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.NFC"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.androidnfc.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

public class MainActivity extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback
{ 
   TextView textInfo;
   EditText textOut;  
   NfcAdapter nfcAdapter; …
Run Code Online (Sandbox Code Playgroud)

android nfc nfc-p2p android-5.0-lollipop android-screen-pinning

12
推荐指数
1
解决办法
722
查看次数

如何在android Lollipop中检查活动是否被锁定(app pinning)

我想知道一个活动是否在android 5.0及更高版本的app apping下被锁定.请帮帮我!

谢谢!

task android-activity android-5.0-lollipop android-screen-pinning

11
推荐指数
1
解决办法
3588
查看次数

Activity.startLockTask()偶尔会抛出IllegalArgumentException

我目前有一个周期性的问题,IllegalArgumentException我打电话给我Activity.startLockTask().我的应用程序安装了设备所有者应用程序,允许我的程序包自动固定自己.

下面的代码是检查以确保我的包可以锁定自己.如果它可以,那么它自己固定.

码:

if (dpm.isLockTaskPermitted(getPackageName())) {
    super.startLockTask();
}
Run Code Online (Sandbox Code Playgroud)

logcat的:

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)
Run Code Online (Sandbox Code Playgroud)

问题是我的应用需要偶尔重启自己.因此,我们取消固定,完成活动并使用新任务重新启动它,然后退出我们的流程.当活动恢复时,它试图固定自己 - 有时它有效 - 有时它不会.我相信我们如何重新启动可能是抛出异常的原因,但它应该无关紧要,因为新活动是在前台并且是IS重点.

一旦活动失败,它就会继续失败,只要它尝试:如果我坐在那里尝试每5秒固定一次任务,它每次都会继续失败.我试着钉扎onCreate,onWindowFocusChanged,onResume,和onStart.

有谁知道问题可能是什么?

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

android android-5.0-lollipop android-screen-pinning

10
推荐指数
1
解决办法
3396
查看次数

测试当前任务是否被锁定的方法?

我正在使用运行Android 5.0.1的Nexus 4上的任务锁定API.我的设备所有者应用程序包含两个按钮:"锁定"和"解锁",只需调用startLockTask()stopLockTask().这真的是它的全部,但是因为有些人坚持看到样板:

public class MainActivity extends Activity {    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.lockButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startLockTask();
            }           
        });

        findViewById(R.id.unlockButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopLockTask();
            }           
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

任务已锁定时按"锁定"按钮是无害的.但是如果我在没有锁定任务时按下"解锁"按钮,我会得到一个NPE:

02-12 22:58:11.942: E/AndroidRuntime(12888): java.lang.NullPointerException: Attempt to read from field 'android.content.Intent com.android.server.am.TaskRecord.intent' on a null object reference
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Parcel.readException(Parcel.java:1546)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.os.Parcel.readException(Parcel.java:1493)
02-12 22:58:11.942: E/AndroidRuntime(12888):    at android.app.ActivityManagerProxy.stopLockTaskMode(ActivityManagerNative.java:5245)
02-12 …
Run Code Online (Sandbox Code Playgroud)

android android-screen-pinning

8
推荐指数
1
解决办法
2618
查看次数

在Android Studio屏幕录像机中标记光标的单击/轻击/双击

Android Screen Recorder是捕获Android屏幕的好工具,但是当我们在Android Phone / Emulator屏幕上浏览该应用程序时,是否还可以突出显示单击和点击?

android android-screen screen-recording android-screen-pinning

7
推荐指数
1
解决办法
1530
查看次数

Android Kiosk模式 - 防止用户"未经授权"取消固定应用程序

我对Android很新,我目前正在开发一个应该在KioskMode中运行的Android应用程序,这样普通用户就无法退出应用程序或做任何事情.
我已经做了什么:

  • 我将我的应用设置为设备所有者
  • 我在MainActivity中的onCreate() - 方法中"屏蔽"应用程序作为设备所有者
  • 我在MainActivity中有一个按钮,稍后允许管理员通过输入密码退出.调用stopLockTask()

我现在遇到的问题是,任何用户都可以通过同时长按"后退"和"多任务"按钮退出屏幕固定,因为运行应用程序的平板电脑有硬件按钮,我不能简单地停用它.(至少我不知道如何在没有设备生根的情况下执行此操作)
那么有没有办法停用此按钮组合以退出屏幕固定或一些整洁的解决方法?我想到的一种方法是在onLockTaskModeExiting()中的AdminReceiver类中重用Application,但我仍然坚持如何做到这一点.

以下是我的MainActivity和AdminReceiver类的一些代码片段:
AdminReceiver.java

public class AdminReceiver extends DeviceAdminReceiver{

@Override
public void onEnabled(Context context, Intent intent) {
    Toast.makeText(context, context.getString(R.string.device_admin_enabled), Toast.LENGTH_SHORT).show();
}

@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
    return context.getString(R.string.device_admin_warning);
}

@Override
public void onDisabled(Context context, Intent intent) {
    Toast.makeText(context, context.getString(R.string.device_admin_disabled), Toast.LENGTH_SHORT).show();
}

@Override
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) {
    Toast.makeText(context, context.getString(R.string.kiosk_mode_enabled), Toast.LENGTH_SHORT).show();
}

@Override
public void onLockTaskModeExiting(Context context, Intent intent) {
    Toast.makeText(context, context.getString(R.string.kiosk_mode_disabled), Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)

}

MainActivity.java

public …
Run Code Online (Sandbox Code Playgroud)

android kiosk android-5.0-lollipop android-screen-pinning device-owner

6
推荐指数
1
解决办法
1753
查看次数

当应用程序处于 Pin 模式时仍会出现绘制

我正在制作一个教育应用程序,我利用 pin 模式将用户锁定在我的应用程序中,但即使应用程序处于 pin 模式,draw-overs 仍然出现在应用程序的顶部。当应用程序处于固定模式时,像 Facebook Messenger 这样的应用程序可以在应用程序上绘制。有没有办法在 pin 模式下完全限制平局?

android android-screen-pinning

6
推荐指数
0
解决办法
67
查看次数

startLockTask() 无需请求用户操作

我想在没有任何用户请求的情况下激活 startLockTask() 。因此,首先我阅读了此设备管理 并创建了小型示例应用程序。结果,我的应用程序位于设备管理员列表中,但是当我调用 startLockTask() 时,它仍然不以静默模式执行。当我试图这样称呼它时:

    DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    String[] packages = {this.getPackageName()};                        
    myDevicePolicyManager.setLockTaskPackages(deviceAdminComponentName, packages);
    startLockTask();
Run Code Online (Sandbox Code Playgroud)

我遇到下一个异常:java.lang.SecurityException: Admin ComponentInfo{com.hssoft.deviceadmintest/com.hssoft.deviceadmintest.DeviceAdmin} does not own the device

所以我有设备管理员,但我不是设备所有者。我做错了什么,有人可以帮忙吗?这是我的完整应用程序代码:

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hssoft.deviceadmintest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name="com.hssoft.deviceadmintest.DeviceAdmin"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <meta-data android:name="android.app.device_admin"
                       android:resource="@xml/device_admin" />
            <intent-filter>
                <action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE"/>
            </intent-filter>
        </receiver>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

xml/device_admin.xml:

<?xml version="1.0" encoding="utf-8"?>
<device-admin>
    <uses-policies>
        <limit-password/>
        <watch-login/>
        <reset-password/>
        <force-lock/>
        <wipe-data/>
        <expire-password/>
        <encrypted-storage/> …
Run Code Online (Sandbox Code Playgroud)

android kiosk-mode android-screen-pinning device-owner

5
推荐指数
1
解决办法
7075
查看次数

Activity.startLockTask() 从一个Activity到另一个Activity

我正在使用Activity.startLockTask()并注意到,如果我将屏幕固定在活动 A 中,我将无法转换到活动 B。似乎我必须在活动 B 上一次startLockTask()又一次stopLockTask()地转换。startLockTask()

有没有更好的方法来处理这个问题,以便我可以固定整个应用程序,无论我正在进行什么活动?

这就是我固定应用程序的方式:

// start lock task mode if it's not already active
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// ActivityManager.getLockTaskModeState api is not available in pre-M
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
    if (!am.isInLockTaskMode()) {
        startLockTask();
    }
} else {
    if (am.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_NONE) {
        startLockTask();
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我停止固定的方式

stopLockTask()
Run Code Online (Sandbox Code Playgroud)

android kiosk android-screen-pinning

5
推荐指数
1
解决办法
3744
查看次数

如何退出屏幕固定 - Android 5(模拟器)

屏幕固定(如本页所述)是Android 5(Lollipop)中引入的一项新功能,它允许用户暂时仅将一个活动锁定到屏幕上.激活屏幕固定时,将隐藏所有其他通知.

可以采取以下步骤来激活屏幕固定

用户可以在"设置">"安全性">"屏幕固定"中启用屏幕固定,并通过触摸最近屏幕中的绿色图钉图标选择要固定的任务.

要退出屏幕固定,用户可以执行以下操作

用户可以通过按住"后退"和"最近"按钮退出

我想问的是

有没有办法退出Android Emulator for 5.0上的屏幕固定?因为我们无法同时使用鼠标同时按下后退和最近按钮?

谢谢.

java android android-emulator android-5.0-lollipop android-screen-pinning

4
推荐指数
1
解决办法
2027
查看次数

Android - Lollipop Screen固定是否适用于同一个应用中的多个活动?

我正在尝试将自助服务终端功能添加到Android应用程序中.我希望利用Lollipop的屏幕固定功能,一旦启动就自动固定应用程序.应用程序UI已经构建了几个不同的活动.我在入口点活动startLockTask()onCreate()方法中调用一次,但是一旦我导航到应用程序中的另一个活动,它就会取消.

我需要startLockTask()在每次活动中打电话onCreate()/onResume()吗?这将产生糟糕的用户体验,因为每次我在应用程序中从一个活动移动到另一个活动时,将出现"屏幕固定"烤面包.

我正在开发运行Android 5.0.2的Moto E(第二代)上的应用程序.

android android-5.0-lollipop android-screen-pinning

4
推荐指数
1
解决办法
1552
查看次数