6

मैं संपर्क प्रबंधन के लिए सरल विजेट बना रहा हूं, जो उपयोगकर्ता को वांछित संपर्क में एसएमएस भेजने और भेजने की अनुमति देता है।लॉकस्क्रीन से नई गतिविधि कैसे शुरू करें?

यह "सामान्य विजेट" के रूप में ठीक काम करता है, लेकिन जब मैं इसे एंड्रॉइड 4.2 पर लॉकस्क्रीन विजेट के रूप में जोड़ता हूं, तो एसएमएस ऐप या डायल ऐप शुरू नहीं होता है। वास्तव में वे स्टार हैं, लेकिन "पीछे" लॉकस्क्रीन हैं, इसलिए उपयोगकर्ता को अभी भी एसएमएस डायल करने/भेजने में सक्षम होने के लिए मैन्युअल रूप से अनलॉक करना होगा।

मैंने कुछ समाधान के लिए वेब की खोज की, लेकिन कुछ भी आसान नहीं हुआ। मुझे FLAG_DISABLE_KEYGUARD या FLAG_SHOW_WHEN_LOCKED के बारे में पता है, लेकिन चूंकि एसएमएस/डायल ऐप्स "मेरा" नहीं हैं इसलिए मुझे नहीं पता कि वे उचित ध्वज सेट करते हैं या नहीं। एक कामकाज के रूप में मैंने अपनी गतिविधि बनाने की कोशिश की जो उन झंडे को सेट करता है और फिर बस वांछित (डायल या एसएमएस) शुरू करता है, लेकिन इससे मदद नहीं मिलती है।

स्क्रीन अनलॉक करने का एक तरीका है, लेकिन इसमें KeyguardManager और KeyguardLock (जो ठीक काम करता है) का उपयोग करना शामिल है, लेकिन KeyguardLock.newKeyguardLock() का उपयोग करने के परिणामस्वरूप मैं फोन के साथ अंततः लॉक चालू करने में सक्षम नहीं हूं, निश्चित रूप से क्योंकि मैं इस लॉक को रिलीज़ नहीं करता (यह लॉक को फिर से दिखने का कारण बनता है, जो मैं नहीं चाहता)।

वास्तव में, इस विजेट को लॉक स्क्रीन पर डिफ़ॉल्ट एसएमएस विजेट या मेल विजेट के साथ समान रूप से काम करना चाहिए?

तो, मेरा सवाल है, इसे कैसे प्राप्त करें और लॉकस्क्रीन से नई गतिविधि शुरू करें?

+0

हाय फ़िलिप। मैं भी इसी बारे में सोच रहा था। मैं एंड्रॉइड के लिए काफी नया हूँ। तो क्या आप यहां थोड़ी मदद कर सकते हैं? आप विजेट लेआउट में बटन पर क्लिक श्रोताओं को कैसे सेट करते हैं या देखते हैं? क्या आपके ऐपविड्जप्रोवाइडर क्लास की ऑनसीस विधि पर इसका कुछ संबंध है? –

+0

हाय, ठीक है, यह स्पष्ट करने के लिए इतना स्पष्ट और काफी मुश्किल नहीं है (इसे कार्यान्वित करने का उल्लेख नहीं है :))। मुझे यह समझने में थोड़ी देर लग गई। संक्षेप में, आपको इसे प्राप्त करने के लिए 'लंबित इंटेंन्ट' और 'रिमोट व्यू' कक्षाओं का उपयोग करने की आवश्यकता है। [दस्तावेज़ीकरण] (http://developer.android.com/guide/topics/appwidgets/index.html#implementing_collections) के अंदर देखने का सबसे अच्छा तरीका है। संक्षेप में, जब आपके पास 'रिमोट व्यू' के माध्यम से कॉन्फ़िगर किया गया है, तो 'RemoteView # setOnClickFillInIntent' विधि' के माध्यम से इसमें 'लंबितइन्टेंट' ऑब्जेक्ट को इंजेक्ट करें। –

उत्तर

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' सत्य है। – mamuso

संबंधित मुद्दे