试图锁定手机时应用已停止

时间:2018-01-16 08:28:57

标签: java android performance android-studio

&(**argv)

时出错

错误: Right after I clicked "lock" button

Debug: I did double check my permission(Activate this device admin app_1)

Debug: I did double check my permission(Activate this device admin app_2)

我的目标:我试图点击或摇动手机锁定它。

以下是来源:

RewriteRule ^site/([a-zA-Z])$ ccroipr.php?id=$1

更新1: @jozef Dochan

这是Logcat

devicePolicyManager.lockNow();

更新2:

Controller.java:

import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.hardware.SensorManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
Button b_enable, b_lock;

static final int RESULT_ENABLE = 1;
DevicePolicyManager devicePolicyManager;
ComponentName componentName;


private SensorManager sm;
private float acelVal; // Current acceleration value and gravity.
private float acellast; // Last Acceleration value and Gravity.
private float shake;  // Acceleration value different from gravity.

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    sm.registerListener(sensorListener, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);

   acelVal = SensorManager.GRAVITY_EARTH;
   acellast = SensorManager.GRAVITY_EARTH;
   shake = 0.00f;

   b_enable = (Button) findViewById(R.id.b_enable);
   b_lock = (Button) findViewById(R.id.b_lock);

   devicePolicyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
   componentName = new ComponentName(MainActivity.this, Controller.class);

   boolean active = devicePolicyManager.isAdminActive(componentName);

   if (active){
       b_enable.setText("Disable");
       b_lock.setVisibility(View.VISIBLE);
   }
   else{
       b_enable.setText("ENABLE");
       b_lock.setVisibility(View.GONE);
   }


   b_enable.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
           boolean active = devicePolicyManager.isAdminActive(componentName);
           if(active){
               devicePolicyManager.removeActiveAdmin(componentName);
               b_enable.setText("ENABLE");
               b_lock.setVisibility(View.GONE);
           }
           else{
               Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
               intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);
               intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "You should enable the app!");
               startActivityForResult(intent, RESULT_ENABLE);
           }


       }
   });

   b_lock.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
          // Toast toast = Toast.makeText(getApplicationContext(), "b_lock: onClick!!!!", Toast.LENGTH_LONG);
          // toast.show();

           boolean active = devicePolicyManager.isAdminActive(componentName);

           if(active){
               Toast toast = Toast.makeText(getApplicationContext(), "b_lock: onClick got permission!!!", Toast.LENGTH_LONG);
               toast.show();
           }else{
               Toast toast = Toast.makeText(getApplicationContext(), "b_lock: onClick did not have permission!!!", Toast.LENGTH_LONG);
               toast.show();
           }

           devicePolicyManager.lockNow();
       }
   });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode){
        case RESULT_ENABLE:
        if(resultCode == Activity.RESULT_OK){
            b_enable.setText("DISABLE");
            b_lock.setVisibility(View.VISIBLE);
        } else{
            Toast.makeText(this, "Failed", Toast.LENGTH_SHORT).show();
        }
        return;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

private final SensorEventListener sensorListener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {

        float x = sensorEvent.values[0];
        float y = sensorEvent.values[1];
        float z = sensorEvent.values[2];

        acellast = acelVal;
        acelVal= (float) Math.sqrt((double) (x*x + y*y + z*z));
        float delta = acelVal - acellast;
        shake = shake * 0.9f + delta;

        if (shake > 12) {
            // DO something
            //example:
            Toast toast = Toast.makeText(getApplicationContext(), "DO NOT SHAKE ME, PLEASE!!", Toast.LENGTH_LONG);
            toast.show();
            devicePolicyManager.lockNow();
        }
   }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }
};
}`

的AndroidManifest.xml:

01-16 00:47:45.910 15079-15079/com.example.eric.shake_lock_unlock I/zygote: Not late-enabling -Xcheck:jni (already on)
01-16 00:47:45.930 15079-15079/com.example.eric.shake_lock_unlock W/zygote: Unexpected CPU variant for X86 using defaults: x86
01-16 00:47:45.982 15079-15086/com.example.eric.shake_lock_unlock E/zygote: Failed writing handshake bytes (-1 of 14): Broken pipe
01-16 00:47:45.982 15079-15086/com.example.eric.shake_lock_unlock I/zygote: Debugger is no longer active
01-16 00:47:46.086 15079-15079/com.example.eric.shake_lock_unlock I/InstantRun: starting instant run server: is main process
01-16 00:47:46.337 15079-15096/com.example.eric.shake_lock_unlock D/OpenGLRenderer: HWUI GL Pipeline

                                                                                    [ 01-16 00:47:46.378 15079:15096 D/         ]
                                                                                    HostConnection::get() New Host Connection established 0x998a4a80, tid 15096
01-16 00:47:46.384 15079-15096/com.example.eric.shake_lock_unlock I/zygote: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
01-16 00:47:46.384 15079-15096/com.example.eric.shake_lock_unlock I/OpenGLRenderer: Initialized EGL, version 1.4
01-16 00:47:46.384 15079-15096/com.example.eric.shake_lock_unlock D/OpenGLRenderer: Swap behavior 1
01-16 00:47:46.389 15079-15096/com.example.eric.shake_lock_unlock W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
01-16 00:47:46.390 15079-15096/com.example.eric.shake_lock_unlock D/OpenGLRenderer: Swap behavior 0
01-16 00:47:46.402 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglCreateContext: 0xa310c240: maj 3 min 0 rcv 3
01-16 00:47:46.427 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:47:46.430 15079-15096/com.example.eric.shake_lock_unlock E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
01-16 00:47:46.431 15079-15096/com.example.eric.shake_lock_unlock E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
01-16 00:47:46.432 15079-15096/com.example.eric.shake_lock_unlock E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
01-16 00:47:46.432 15079-15096/com.example.eric.shake_lock_unlock E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
01-16 00:47:46.481 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:47:50.292 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:47:50.315 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:04.151 15079-15079/com.example.eric.shake_lock_unlock I/Choreographer: Skipped 31 frames!  The application may be doing too much work on its main thread.
01-16 00:48:05.050 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:05.061 15079-15096/com.example.eric.shake_lock_unlock D/OpenGLRenderer: endAllActiveAnimators on 0x98a57c80 (RippleDrawable) with handle 0xa31479c0
01-16 00:48:11.973 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:12.161 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:19.348 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:19.353 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:20.420 15079-15084/com.example.eric.shake_lock_unlock I/zygote: Do partial code cache collection, code=26KB, data=30KB
01-16 00:48:20.421 15079-15084/com.example.eric.shake_lock_unlock I/zygote: After code cache collection, code=26KB, data=30KB
01-16 00:48:20.421 15079-15084/com.example.eric.shake_lock_unlock I/zygote: Increasing code cache capacity to 128KB
01-16 00:48:20.948 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:20.954 15079-15096/com.example.eric.shake_lock_unlock D/OpenGLRenderer: endAllActiveAnimators on 0x98a57c80 (RippleDrawable) with handle 0xa3147670
01-16 00:48:22.143 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:22.217 15079-15096/com.example.eric.shake_lock_unlock D/EGL_emulation: eglMakeCurrent: 0xa310c240: ver 3 0 (tinfo 0xa311b490)
01-16 00:48:24.781 15079-15079/com.example.eric.shake_lock_unlock D/AndroidRuntime: Shutting down VM
01-16 00:48:24.783 15079-15079/com.example.eric.shake_lock_unlock E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.example.eric.shake_lock_unlock, PID: 15079
                                                                                    java.lang.SecurityException: No active admin owned by uid 10080 for policy #3
                                                                                        at android.os.Parcel.readException(Parcel.java:2004)
                                                                                        at android.os.Parcel.readException(Parcel.java:1950)
                                                                                        at android.app.admin.IDevicePolicyManager$Stub$Proxy.lockNow(IDevicePolicyManager.java:4508)
                                                                                        at android.app.admin.DevicePolicyManager.lockNow(DevicePolicyManager.java:3113)
                                                                                        at android.app.admin.DevicePolicyManager.lockNow(DevicePolicyManager.java:3085)
                                                                                        at com.example.eric.shake_lock_unlock.MainActivity$2.onClick(MainActivity.java:100)
                                                                                        at android.view.View.performClick(View.java:6294)
                                                                                        at android.view.View$PerformClick.run(View.java:24770)
                                                                                        at android.os.Handler.handleCallback(Handler.java:790)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                        at android.os.Looper.loop(Looper.java:164)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:6494)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

device_admin.xml:

package com.example.eric.shake_lock_unlock;

import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;


public class Controller extends DeviceAdminReceiver{

    public void onEnabled(Context context, Intent intent){
        Toast.makeText(context, "Enabled!", Toast.LENGTH_SHORT).show();
    }

    public void onDisabled(Context context, Intent intent){
        Toast.makeText(context, "Disabled!", Toast.LENGTH_SHORT).show();
    }
}

2 个答案:

答案 0 :(得分:1)

问题在于componentName 我确定你传递的Controller.java不是DeviceAdminReceiver类型

public class MyDeviceAdminReceiver extends DeviceAdminReceiver {

void showToast(Context context, String msg) {
    String status = context.getString(R.string.admin_receiver_status, msg);
    Toast.makeText(context, status, Toast.LENGTH_SHORT).show();
}

@Override
public void onEnabled(Context context, Intent intent) {
    showToast(context, context.getString(R.string.admin_receiver_status_enabled));
}

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

@Override
public void onDisabled(Context context, Intent intent) {
    showToast(context, context.getString(R.string.admin_receiver_status_disabled));
}

@Override
public void onPasswordChanged(Context context, Intent intent) {
    showToast(context, context.getString(R.string.admin_receiver_status_pw_changed));
}
}

您的ComponentName实例看起来应该更像

new ComponentName(this, MyDeviceAdminReceiver.class);

答案 1 :(得分:0)

还要确保您的AndroidManifest在应用程序标记

中包含以下代码
    <receiver android:name=".MyDeviceAdminReceiver"
        android:label="@string/sample_device_admin"
        android:description="@string/sample_device_admin_description"
        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.DEVICE_ADMIN_ENABLED" />
        </intent-filter>
    </receiver>
res中的

和xml文件夹必须包含一个文件,该文件定义了您要强制执行的所有管理员策略。