唤醒设备不起作用



当屏幕关闭时,我使用此代码唤醒我的设备(Moto G 1 gen),但似乎它不起作用。它仅在屏幕打开时有效。

编辑:现在它可以工作了,但 CallScreen.class 显示 1 秒钟,然后完成。LogCat没有提供任何信息。

法典:

Intent intent = new Intent(MainActivity.this, NiceBroadcastReceiver.class);
    intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    intent.putExtra("name",name);
    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + timeToCall, pendingIntent);

NiceBroadcastReceiver 扩展了 BroadcastReceiver:

 @Override
public void onReceive(Context context, Intent intent) {
    String name = intent.getExtras().getString("name");
    Intent i = new Intent(context, CallScreen.class);
    i.setClassName("(package)", "(class)");
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.putExtra("name2", name);
    context.startActivity(i);
    //Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
}

呼叫屏幕.class:

PowerManager.WakeLock fullWakeLock;
    PowerManager.WakeLock partialWakeLock;
    PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
    fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
    partialWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Loneworker - PARTIAL WAKE LOCK");
    if(fullWakeLock.isHeld()){
        fullWakeLock.release();
    }
    if(partialWakeLock.isHeld()){
        partialWakeLock.release();
    }
    fullWakeLock.acquire();
    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
    keyguardLock.disableKeyguard();
    RelativeLayout rl = (RelativeLayout) findViewById(R.id.relLay);
    rl.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           finish();
        }
    });
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        name = extras.getString("name2");
    }
    incomingCall = (TextView) findViewById(R.id.textIncomingView);
    caller = (TextView) findViewById(R.id.callerId);
    caller.setText(name);
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
    mp = MediaPlayer.create(getApplicationContext(), notification);
    mp.start();

ELAPSED_REALTIME_WAKEUP只会打开 CPU 电源,并且只有在您的BroadcastReceiver onReceive()恢复之前。

所以:

  1. CPU 可能会在您的活动出现之前再次进入睡眠状态,因为startActivity()是异步的,并且onReceive()将在startActivity()真正开始处理之前返回

  2. ELAPSED_REALTIME_WAKEUP没有打开您似乎想要的屏幕

  3. ELAPSED_REALTIME_WAKEUP不会解锁您似乎想要的设备

好的,我知道了。在我看来,FLAGS不能正确地完成他们的工作,所以牛肉是在setContentView之后:

PowerManager.WakeLock wl
...
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN |
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_call_screen);
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag");
    wl.acquire();
    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("TAG");
    keyguardLock.disableKeyguard();

最新更新