6

私は連絡先管理のための簡単なウィジェットを作成しています。これにより、ユーザーはダイアルして希望の連絡先にSMSを送信できます。lockscreenから新しいアクティビティを開始するには?

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

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

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

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

私の質問は、これを達成し、lockscreenから新しいアクティビティを開始する方法です。

+0

こんにちはフィリップ

は(プロキシを呼び出す)ウィジェット内の意図を呼び出します。私は同じことについて不思議だった。私はアンドロイドにはかなり新しいです。あなたは私を少しでも助けてくれますか?クリックリスナーをウィジェットレイアウトのボタンまたはビューに設定するにはどうすればよいですか?それはあなたのAppWidgetProviderクラスのonReceiveメソッドと関係がありますか? –

+0

こんにちは、 これはあまり明白ではありません。私はこれを理解するために私をしばらく捉えました。つまり、達成するためには 'PendingIntent'と' RemoteView'クラスを使う必要があります。最善の方法は[documentation](http://developer.android.com/guide/topics/appwidgets/index.html#implementing_collections)を参照することです。 'RemoteView#setOnClickFillInIntent'メソッドを使用して' PendingIntent'オブジェクトを 'RemoteView'で設定するだけです。 –

答えて

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); 


} 
+0

私の2セント:ハンドラを使う代わりに、 'pHasFocus'がtrueのときに' onWindowsFocusChanged(pHasFocus) 'で' startActivity() 'と' finish() 'を呼び出すことができます。 – mamuso

関連する問題