6

我正在为联系人管理创建简单的小部件,它允许用户拨号并向所需联系人发送短信。

它可以作为“普通小部件”正常工作,但是当我在 Android 4.2 上将其添加为锁屏小部件时,短信应用程序或拨号应用程序无法启动。好吧,事实上他们是明星,但在“背后”锁屏,所以用户仍然必须手动解锁屏幕才能拨打/发送短信。

我在网上搜索了一些解决方案,但没有什么能派上用场。我知道 FLAG_DISABLE_KEYGUARD 或 FLAG_SHOW_WHEN_LOCKED,但由于短信/拨号应用程序不是“我的”,所以我不知道它们是否设置了正确的标志。作为一种解决方法,我尝试创建设置这些标志的活动,然后简单地启动所需的一个(拨号或短信),但这无济于事。

有一种解锁屏幕的方法,但这涉及使用 KeyguardManager 和 KeyguardLock (工作正常),但由于使用 KeyguardLock.newKeyguardLock() 我最终导致手机无法自动打开锁定,肯定是因为我没有释放这个锁(它会导致锁再次出现,这不是我想要的)。

事实上,这个小部件应该与锁定屏幕上的默认短信小部件或邮件小部件类似地工作?

所以,我的问题是,如何实现这一点并从锁屏开始新的活动?

4

1 回答 1

7

好吧,我自己找到了解决方案。原来我很接近:)

要启动 3rd 方应用程序/活动,最简单的解决方案是创建某种代理活动,它将在窗口上设置适当的标志,然后启动所需的活动并完成。

示例代码如下所示:

小部件中的调用意图(调用代理):

    @Override
public void onReceive(Context context, Intent intent) {
    Utilities.printLog(TAG, "onReceive");
    Utilities.printLog(TAG, "intent: " + intent);
    if (intent.getAction().equals(ACTION)) {

        final String number = intent.getStringExtra(EXTRAS);
        Toast.makeText(context, "Selected number: " + number,
                Toast.LENGTH_SHORT)
                .show();


        /** REMOVING KEYGUARD RECEIVER **/
        // not really an option - lock is still holded by widget and screen
        // cannot be locked again ;(
        // KeyguardManager keyguardManager = (KeyguardManager) context
        // .getSystemService(Context.KEYGUARD_SERVICE);
        // KeyguardLock lock = keyguardManager
        // .newKeyguardLock(Context.KEYGUARD_SERVICE);
        // lock.disableKeyguard();

        final Intent activity = new Intent(context, MainActivity.class);
        activity.putExtras(intent.getExtras());
        activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        activity.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
        context.startActivity(activity);
    }

    super.onReceive(context, intent);
}

在代理活动中只需调用:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

    final Intent callingIntent = getIntent();

    final String actionToLaunch = callingIntent.getStringExtra(ContactsStackWidgetProvider.ACTION);
    final String number = callingIntent.getStringExtra(ContactsStackWidgetProvider.EXTRAS);

    final Intent activity = new Intent();
    if (actionToLaunch.equals(Intent.ACTION_DIAL)) {
        activity.setAction(Intent.ACTION_DIAL);
        activity.setData(Uri.parse("tel:"+number));
    } else if (actionToLaunch.equals(Intent.ACTION_SENDTO)) {
        activity.setAction(Intent.ACTION_SENDTO);
        activity.setData(Uri.parse("sms:"+number));
    } else {
        throw new IllegalArgumentException("Unrecognized action: "
                + actionToLaunch);
    }

    new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            startActivity(activity);
            finish();//it is important to finish, but after a small delay
        }
    }, 50L);


}
于 2013-04-24T11:36:46.990 回答