6

連絡先管理用のシンプルなウィジェットを作成しています。これにより、ユーザーは目的の連絡先にダイヤルして SMS を送信できます。

「通常のウィジェット」としては問題なく動作するのですが、Android 4.2 でロック画面のウィジェットとして追加すると、SMS アプリやダイヤル アプリが起動しません。実際、彼らはスターですが、ロック画面の「背後」にあるため、ユーザーは手動で画面のロックを解除して、SMS をダイヤルしたり送信したりできるようにする必要があります。

解決策をウェブで検索しましたが、何も役に立ちません。FLAG_DISABLE_KEYGUARD または FLAG_SHOW_WHEN_LOCKED については認識していますが、SMS/ダイヤル アプリは「私のもの」ではないため、適切なフラグが設定されているかどうかはわかりません。回避策として、これらのフラグを設定し、目的のフラグ (ダイヤルまたは SMS) を開始するアクティビティを作成しようとしましたが、これは役に立ちません。

画面のロックを解除する方法はありますが、これには KeyguardManager と KeyguardLock (どちらも正常に動作します) を使用する必要がありますが、KeyguardLock.newKeyguardLock() を使用した結果、電話を自動的にロックできなくなります。このロックを解除します (ロックが再び表示されますが、これは私が望んでいるものではありません)。

実際、このウィジェットはデフォルトの SMS ウィジェットやロック画面のメール ウィジェットと同様に機能するはずですか?

それで、私の質問は、それを達成し、ロックスクリーンから新しいアクティビティを開始する方法ですか?

4

1 に答える 1

7

まあ、私は自分で解決策を見つけました。私は近くにいたことがわかりました:)

サードパーティのアプリ/アクティビティを起動するための最も簡単な解決策は、何らかのプロキシ アクティビティを作成することです。これにより、ウィンドウに適切なフラグが設定され、目的のアクティビティが起動されて終了します。

サンプルコードを以下に示します。

ウィジェットでインテントを呼び出す (プロキシを呼び出す):

    @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 に答える