2016-10-10 15 views
7

मुझे एक ऐसा ऐप मिला है जो डिफ़ॉल्ट लॉन्चर के रूप में खुद को पंजीकृत करता है और पिन शुरू होने पर स्वचालित रूप से पिन करता है।बूट पर एंड्रॉइड पिन गतिविधि

यह सब इंस्टॉल करते समय ठीक काम करता है। यह खुद पिन करता है और केवल बैक बटन दिखाई देता है।

समस्या यह है कि जब डिवाइस पहले बूट हो जाता है, तो यह ठीक से पिन नहीं करता है। मैं टोस्ट्स की एक श्रृंखला "स्क्रीन पिन किया गया" और "स्क्रीन अनपिन" कई बार देखता हूं। "होम" और "हालिया कार्य" बटन अभी भी दिखाई दे रहे हैं।

-

चल रहा है "adb shell dumpsys गतिविधि गतिविधियों" - पिछले रेखा यह दर्शाती है कि यह पिन नहीं की है:

mLockTaskModeState=NONE mLockTaskPackages (userId:packages)= 
0:[com.example.myapp] 
mLockTaskModeTasks[] 

-

परीक्षण उपकरण Asus ZenPad चल Marshmallow/6.0/23

मैं पिन करने के लिए मुख्य कार्यशीलता विशेषता विशेषता "लॉकटास्कोड" पर निर्भर हूं (गतिविधि के बजाय .startLockTask()):

<activity 
    android:name=".MainActivity" 
    android:configChanges="keyboardHidden|orientation|screenSize" 
    android:label="@string/launcher_main" 
    android:launchMode="singleTask" 
    android:lockTaskMode="if_whitelisted" 
    android:screenOrientation="landscape"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN"/> 
     <category android:name="android.intent.category.HOME"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
     <category android:name="android.intent.category.LAUNCHER"/> 
    </intent-filter> 
</activity> 

कोई मदद या संकेत

+0

यदि आप डिफ़ॉल्ट 'लॉकटास्कोड' का उपयोग करते हैं और 'startLockTask()' कहते हैं तो क्या होता है? –

+0

वैसे ही व्यवहार करने लगता है –

+0

मुझे आश्चर्य है कि लॉन्चर शुरू करने और कार्य पिनिंग अनुमतियों को स्थापित करने के बीच दौड़ की स्थिति है या नहीं।मैंने एक ऐप लिखा था जो शुरू होने पर स्वचालित रूप से पिन करता है, लेकिन लॉन्चर होने की बजाय, यह 'BOOT_COMPLETED' के जवाब में शुरू होता है। लॉन्चर प्रकट होने के बाद यह कई सेकंड प्रसारित होता है। –

उत्तर

2

सराहना की होगी मैं एक ही समस्या थी और मैं वास्तव में केवल एक ही समाधान मिल सकता है। मुझे यकीन नहीं है कि क्यों, लेकिन हाँ, एंड्रॉइड में कुछ टास्क लॉकिंग को रोकता है जब बूटिंग लॉक को मेरे दिमाग को चकमा देता है क्योंकि टास्क लॉक को इन "कियोस्क" प्रकार के अनुप्रयोगों को बनाने के लिए डिज़ाइन किया गया था। एकमात्र समाधान जो मुझे मिल सकता था वह किसी मामले के लिए पता लगाना था जब उसने लॉक नहीं किया था और फिर एप्लिकेशन को पुनरारंभ करें। यह थोड़ा "हैकी" है लेकिन आप और क्या कर सकते हैं?

उस मामले का पता लगाने के लिए जहां उसने लॉक नहीं किया था, मैंने एक राज्य चर बना दिया और राज्यों को असाइन किया (लॉकिंग, लॉक, अनलॉकिंग, अनलॉक)। फिर डिवाइस में व्यवस्थापक रिसीवर onTaskModeExiting में अगर राज्य "अनलॉकिंग" नहीं है तो मुझे पता है कि यह स्वयं अनलॉक है।

:

how to programmatically "restart" android app?

यहां कुछ नमूना कोड है: तो कहीं ऐसा तो नहीं हुआ है, जहां यह विफल रहा है, मैं तो इस विधि (जो कार्यक्रम अलार्म प्रबंधक में आवेदन तो आवेदन को मारता है) का उपयोग कर अनुप्रयोग फिर से आरंभ

DeviceAdminReceiver

@Override 
public void onLockTaskModeEntering(Context context, Intent intent, String pkg) { 
    super.onLockTaskModeEntering(context, intent, pkg); 
    Lockdown.LockState = Lockdown.LOCK_STATE_LOCKED; 
} 

@Override 
public void onLockTaskModeExiting(Context context, Intent intent) { 
    super.onLockTaskModeExiting(context, intent); 

    if (Lockdown.LockState != Lockdown.LOCK_STATE_UNLOCKING) { 
     MainActivity.restartActivity(context); 
    } 
    Lockdown.LockState = Lockdown.LOCK_STATE_UNLOCKED; 
} 

MainActivity

public static void restartActivity(Context context) { 
    if (context != null) { 
     PackageManager pm = context.getPackageManager(); 
     if (pm != null) { 
      Intent intent = pm.getLaunchIntentForPackage(context.getPackageName()); 
      if (intent != null) { 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       int pendingIntentId = 223344; 
       PendingIntent pendingIntent = PendingIntent.getActivity(context, pendingIntentId, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
       AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
       mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent); 
       System.exit(0); 
      } 
     } 
    } 
} 

private void lock() { 
    Lockdown.LockState = Lockdown.LOCK_STATE_LOCKING; 
    startLockTask(); 
} 

private void unlock() { 
    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    if (am.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED) { 
     Lockdown.LockState = Lockdown.LOCK_STATE_UNLOCKING; 
     stopLockTask(); 
    } 
} 

सच में यह मेरे द्वारा लागू किए गए कार्यों का सरलीकृत संस्करण है। लेकिन उम्मीद है कि आप एक समाधान की ओर इशारा करते हैं।

+0

तोड़ने के लिए इसे क्या ट्रिगर कर रहा है यह आदर्श समाधान नहीं है, लेकिन यह कियोस्क मोड से बचने वाले उपयोगकर्ता के खिलाफ सुरक्षा करता है। ऐप को मार दिया जाएगा और फिर से लॉन्च किया जाएगा (माना जाता है कि यह डिफ़ॉल्ट लॉन्चर है)। –

+0

उम्मीद है कि यह भविष्य में एंड्रॉइड संस्करणों –

+0

में साफ हो जाएगा मेरे लिए यह काम नहीं करता है। मेरी गतिविधि हमेशा की तरह रीबूटिंग, अनंत लूप में; (कोई और समाधान कृपया? – LionisIAm

0

एकमात्र समाधान जो मैंने अभी पाया है: लॉकटास्क के बिना एक और लॉन्चर ऐप बनाएं, जो लॉन्चर दिखाई देने पर हर बार मुख्य ऐप ट्रिगर करेगा। यह उपयोगकर्ता को BOOT_COMPLETED रिसीवर पर लॉकटास्क किए गए ऐप के साथ कॉल करने से पहले कुछ और सेकंड प्रतीक्षा करने से रोकता है। तो हम केवल तभी समस्या को पूरा कर सकते हैं जब लॉकटास्क ऐप में मैनिफेस्ट में कुछ गतिविधि के लिए लॉन्चर गुण हों।

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