6

저는 연락처 관리를 위해 간단한 위젯을 만들었습니다. 사용자는 전화를 걸어 원하는 연락처에 SMS를 보낼 수 있습니다.lockscreen에서 새로운 활동을 시작하는 방법은 무엇입니까?

"정상 위젯"으로 정상적으로 작동하지만 Android 4.2에서 잠금 화면 위젯으로 추가하면 SMS 앱 또는 다이얼 앱이 시작되지 않습니다. 사실 그들은 별표지만 잠금 화면 뒤에 있기 때문에 사용자는 다이얼을 돌리거나 SMS를 보낼 수 있도록 화면을 수동으로 잠금 해제해야합니다.

나는 웹에서 몇 가지 해결책을 찾았지만 아무 것도 도움이되지 못했습니다. FLAG_DISABLE_KEYGUARD 또는 FLAG_SHOW_WHEN_LOCKED에 대해 알고 있지만 sms/dial 앱은 "광산"이 아니므로 적절한 플래그를 설정했는지 알 수 없습니다. 해결 방법으로 해당 플래그를 설정 한 다음 원하는 대상 (다이얼 또는 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 #'를 통해 뷰를 구성한 경우'RemoteView # setOnClickFillInIntent' 메소드를 통해'PendingIntent' 객체를 해당 객체에 삽입하면됩니다. –

답변

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

나의 두 센트 : 핸들러를 사용하는 대신,'pHAsFocus'가 참일 때'onWindowsFocusChanged (pHasFocus)'에서'startActivity()'와'finish()'를 호출 할 수 있습니다. – mamuso