安卓手机:唤醒并解锁手机

9

我正在尝试使用服务唤醒并解锁手机。我参考了这篇帖子,但是我无法弄清楚为什么它不起作用。目前我的代码如下:

public class WakephoneActivity extends Activity {

    BroadcastReceiver mReceiver;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                // Log.v(TAG, "Screen OFF onReceive()");
                screenOFFHandler.sendEmptyMessageDelayed(0, 2000);
            }
        };
    }

    private Handler screenOFFHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            // do something
            // wake up phone
            // Log.i(TAG, "ake up the phone and disable keyguard");
            PowerManager powerManager = (PowerManager) WakephoneActivity.this
                    .getSystemService(Context.POWER_SERVICE);
            long l = SystemClock.uptimeMillis();
            powerManager.userActivity(l, false);// false will bring the screen
            // back as bright as it was, true - will dim it
        }
    };

    protected void onResume() {
        super.onResume();
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
        registerReceiver(mReceiver, filter);
        // Log.i(TAG, "broadcast receiver registered!");
    }
}

我已经在清单文件中添加了代码。有任何想法吗?


我认为你可以以某种方式移除锁定设置,这样你就可以直接在你的活动中唤醒手机。 - njzk2
3个回答

15

使用以下代码在您的服务中。

PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock((PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "YourServie");
        mWakeLock.acquire();
        [...]
        mWakeLock.release();

如果你想要同时解锁屏幕,那么在你的服务中注册一个接收器来监测屏幕是否开启/关闭。如果屏幕关闭并且你想解锁手机,可以在 onCreate 中使用以下代码启动一个活动:

Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
this.finish();
return;

我知道这很不好,但据我所知,没有其他方法可以解锁锁屏(仅当未设置密码等内容时才有效,因此必须是普通的“滑动以解锁”屏幕)。

别忘了添加android.permission.WAKE_LOCK;-)

/编辑:我刚刚看到你已经在使用Activity。如果您有一个并且根本不需要服务,请将此代码放入Activity中。


1

为了使服务始终处于活动状态,您需要在清单文件中拥有此权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

另外一件你需要做的事情是获取一个WakeLock。如果没有它,服务将在一段时间后结束。你可以这样做:

getApplicationContext();
PowerManager pm = (PowerManager)getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
wl.acquire();

您可能需要将PowerManager.PARTIAL_WAKE_LOCK更改为所需的功能。您可以在此处查看相关信息。


1

WakefulBroadcastReceiver可以为您完成此操作。示例用法:

import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.support.v4.content.WakefulBroadcastReceiver;
import android.util.Log;

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // This is the Intent to deliver to our service.
        Intent service = new Intent(context, SimpleWakefulService.class);

        // Start the service, keeping the device awake while it is launching.
        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
        startWakefulService(context, service);
    }
}
完成服务中的操作后,调用SimpleWakefulReceiver.completeWakefulIntent(intent) 以释放唤醒锁定。
(由于@Force已经提供了有关wakeLock的详细信息,此处无需重复说明;-)
请注意,该类从api level 26.1.0起已被弃用,请参考这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接