android - एंड्रॉइड में डिवाइस रिबूट के बाद प्रसारण रिसीवर काम नहीं कर रहा है




broadcastreceiver android-broadcast (4)

@ अमृत, यह कोशिश करो

<receiver
            android:name=".mics.BootReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter android:priority="500" >
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

QuickBoot आशय फ़िल्टर निकालें और इसे चलाने का प्रयास करें, प्रलेखन के अनुसार हमें केवल इसे हासिल करने के लिए BootCompleted की आवश्यकता है। हो सकता है यह इसमें व्यवधान डाल रहा हो।

नोट करने के लिए एक और महत्वपूर्ण बिंदु:

पूरी तरह से भरोसा न करें या Mi उपकरणों पर परीक्षण न करें क्योंकि उनके पास अपना ओएस है जो एंड्रॉइड की बुनियादी सुविधाओं को रोक देता है, जैसे वे बैटरी उपयोग को अनुकूलित करने के लिए पुश सूचना सेवाओं और पृष्ठभूमि सेवाओं को रोकते हैं। Mi डिवाइस पर यह परीक्षण करने के लिए, अपने ऐप को सुरक्षा ऐप में "AutoStart" के रूप में चिह्नित करें और फिर प्रयास करें।

मैंने पहले ही सभी संबंधित प्रश्नों की जांच कर ली है और इस समस्या का कोई समाधान नहीं पाया है। इसलिए मेरे लिए यह बिल्कुल नई समस्या है।

जो मेरे पास है

मेरे पास एक एंड्रॉइड ऐप है जो अपने प्रकट में कुछ प्रसारण रिसीवरों को पंजीकृत करता है। यह वही है जो मेरा रूप दिखता है।

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.app.myapp">

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />

    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />

    <application
        android:name=".base.MyApp"
        android:allowBackup="false"
        android:icon="@drawable/ic_launcher"
        android:label="@string/label_app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="label, allowBackup">

        <receiver android:name=".mics.BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

        <receiver android:name=".PhoneCallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>

        <receiver
            android:name=".mics.DeviceAdminReceiver"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>

            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin" />
        </receiver>

        <receiver
            android:name="com.clevertap.android.sdk.InstallReferrerBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="com.app.myapp.utils.ImageLoaderModule"
            android:value="GlideModule" />

        <meta-data
            android:name="com.app.myapp.utils.AudioCoverLoaderModule"
            android:value="GlideModule" />

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">

            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

        <activity
            android:name=".core.activities.SplashActivity"
            android:excludeFromRecents="true"
            android:label="@string/label_app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>

        <activity-alias
            android:name=".core.activities.SplashActivity-Alias"
            android:icon="@drawable/ic_launcher"
            android:label="@string/label_app_name"
            android:noHistory="true"
            android:targetActivity="com.app.myapp.core.activities.SplashActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.MONKEY" />
            </intent-filter>

        </activity-alias>

        <activity
            android:name=".core.flow.authFlow.activities.AuthFlowActivity"
            android:excludeFromRecents="true"
            android:label="@string/label_app_name"
            android:screenOrientation="portrait" />

        <service android:name=".features.fileCloudSync.KillNotificationService" />

    </application>

</manifest>

10-15 अन्य गतिविधियाँ भी हैं लेकिन उन्हें सरलता के लिए हटा दिया गया है। और यह मूल बूट रिसीवर वर्ग है। मैं यहां से एक सेवा शुरू करता हूं।

public class BootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            AlertUtils.showToast(context, "BOOT COMPLETED", Toast.LENGTH_LONG);
        }
    }
}

और फोन कॉल रिसीवर वर्ग कुछ इस तरह दिखता है (इसे सरल भी किया गया है),

public class PhoneCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            AlertUtils.showToast(context, "PHONE CALL RECEIVED", Toast.LENGTH_LONG);
            // Simplified for brevity
        }
    }
}

समस्या

जब मैं ऐप इंस्टॉल करता हूं और एक बार इसे शुरू करता हूं तो ये सभी रिसीवर ठीक काम करते हैं। लेकिन मैं अपने डिवाइस को रिबूट करने के बाद ये रिसीवर बिल्कुल काम नहीं करता। न तो BootCompleteReceiver और न ही BootCompleteReceiver को उनकी onReceive() विधि कहा जाता है।

मेरी धारणा यह थी कि रिबूट के बाद ये रिसीवर स्वतः पंजीकृत हो जाएंगे, लेकिन यह काम नहीं करता है। मुझे काम करने के लिए BootCompleteReceiver की आवश्यकता है ताकि मैं अपने ऐप में एक महत्वपूर्ण सेवा शुरू कर BootCompleteReceiver

मेरी टिप्पणियों

मैंने इसका पूरा परीक्षण किया है। डिवाइस को रिबूट करने के बाद, रिसीवर मेरे Nexus 5X (Nougat), Nexus 6P (Nougat), YU Yuphoria (लॉलीपॉप) में ठीक काम करते हैं , लेकिन मेरे OnePlus 3 (Nggat) और Mi 4i (Lollipop) में नहीं

समान कोड कुछ उपकरणों पर पूरी तरह से कैसे काम कर सकता है और अन्य उपकरणों पर बिल्कुल काम नहीं कर सकता है? मैंने कुछ भी नहीं बदला है।

मुझसे यहां क्या गलत हो रहा है? मेरा ऐप इन प्रसारणों पर बहुत अधिक निर्भर है और इन पर आधारित सेवाएं शुरू करता है। किसी भी तरह की सहायता की हम सराहना करेंगे।

EDIT 1

समस्या को बेहतर ढंग से समझने के लिए, मैंने अभी-अभी एक एकल गतिविधि और BootCompleteReceiver उसी BootCompleteReceiver और BootCompleteReceiver साथ एक बहुत छोटा परीक्षण प्रोजेक्ट बनाया।

लेकिन अजीब तरह से, यह परियोजना पूरी तरह से मेरे वनप्लस 3 पर काम करती है जहां मेरे वास्तविक ऐप के रिसीवर रिबूट के बाद काम नहीं करते हैं। मैं शुरू में यह मान रहा था कि समस्या ओएस या डिवाइस में किसी तरह है, लेकिन ऐसा नहीं है।

तो वास्तविक समस्या कहां है? क्या यह मेरे ऐप में है (लेकिन यह अन्य उपकरणों पर पूरी तरह से काम करता है) या ओएस और डिवाइस में (छोटा परीक्षण प्रोजेक्ट उसी ओएस और उसी डिवाइस पर ठीक काम करता है)?

यह वास्तव में मेरे लिए भ्रामक है। मुझे इस पर कुछ विशेषज्ञ की मदद की आवश्यकता होगी।

EDIT 2

मैंने @shadygoneinsane द्वारा दिए गए सुझाव की कोशिश की है। यहाँ मेरे अवलोकन हैं।

1) मैंने ADB के माध्यम से BOOT_COMPLETED प्रसारण भेजने की कोशिश की।

./adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.app.myapp

और मुझे यह स्टैक ट्रेस मिला,

Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED pkg=com.app.myapp }
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.BOOT_COMPLETED from pid=25378, uid=2000
    at android.os.Parcel.readException(Parcel.java:1683)
    at android.os.Parcel.readException(Parcel.java:1636)
    at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:3696)
    at com.android.commands.am.Am.sendBroadcast(Am.java:778)
    at com.android.commands.am.Am.onRun(Am.java:404)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
    at com.android.commands.am.Am.main(Am.java:121)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:276)

शायद इसलिए कि मेरा उपकरण जड़ नहीं है। मैं इस प्रसारण को किसी भी तरह से भेजने में असमर्थ हूं।

2) मैंने उसके बाद PROCESS_OUTGOING_CALLS प्रसारण की कोशिश की।

./adb shell am broadcast -a android.intent.action.PROCESS_OUTGOING_CALLS -p com.app.myapp

मुझे यह मिल गया,

Broadcasting: Intent { act=android.intent.action.PROCESS_OUTGOING_CALLS pkg=com.app.myapp }
Broadcast completed: result=0

ऐसा लगता है कि प्रसारण सफल था, लेकिन मुझे कोई टोस्ट या कोई लॉग नहीं दिखता है। मैंने एक नंबर डायल करने के लिए अपना डायलर खोला और फिर मैं टोस्ट और लॉग दोनों देख सकता हूं।

तो ऐसा लगता है कि एडीबी के माध्यम से प्रसारण भेजने से काम नहीं चला , लेकिन वास्तव में डायलर खोलने और एक नंबर डायल करने से काम चला।

EDIT 3

@ChaitanyaAtkuri के सुझाव के अनुसार, मैंने भी इरादे-फ़िल्टर को प्राथमिकता देने की कोशिश की है, लेकिन यह भी काम नहीं किया।

मैंने 500, 999 और यहां तक ​​कि उच्चतम पूर्णांक मूल्य जैसी प्राथमिकताओं का उपयोग किया है, लेकिन कुछ भी काम नहीं करता है। यह समस्या मेरे कुछ दोस्तों के ऐप में भी हो रही है। वे कुछ उपकरणों में काम करते हैं और दूसरों में काम नहीं करते हैं।

EDIT 4

मैंने आखिरकार अपने वनप्लस 3 में हो रही समस्या की जड़ का पता लगा लिया है । मेरा वनप्लस 3 हाल ही में नूगट में अपडेट हुआ और उन्होंने Mi डिवाइस के समान एक फीचर पेश किया, जो कुछ ऐप्स को रिबूट से ऑटो-स्टार्ट करने से रोकता है।

इस सुविधा को अक्षम करने पर मेरा ऐप पूरी तरह से रिबूट के बाद प्रसारण प्राप्त करना शुरू कर देता है। लेकिन यह अभी भी दो चीजों की व्याख्या नहीं करता है।

1) मेरा छोटा परीक्षण प्रोजेक्ट ऑटोलॉन्च ऐप की सूची में स्वचालित रूप से श्वेत सूची में आता है और इसीलिए यह अपेक्षा के अनुरूप काम करता है। लेकिन यह कैसे संभव है? ओएस इस छोटे ऐप को ऑटो-स्टार्ट होने के योग्य क्यों मानता है?

2) कुछ ऐप हैं जैसे लॉकडाउन प्रो, 500 फायरपेपर जो ऑटोलेक एप स्क्रीन में ब्लैकलिस्ट किए जाते हैं लेकिन फिर भी, यह मेरे वनप्लस 3 और एमआई 4 आई में रिबूट के बाद प्रसारण प्राप्त करता है। अब यह कैसे संभव है? क्या यह संभव है कि इन उपकरणों (वनप्लस और एमआई) में मेरे ऐप को प्रोग्राम लॉन्च करने की अनुमति दी जाए?

EDIT 5

मैंने @ राउल चौधरी द्वारा प्रस्तावित समाधान की कोशिश की है और यह वास्तव में बहुत अच्छा काम करता है। एक्सेसिबिलिटी सर्विस जोड़ने के बाद समस्या फिर से हल हो गई है।

लेकिन अगर उपयोगकर्ता इसे प्रदान करने के बाद पहुंच की अनुमति को रद्द कर देता है तो क्या मेरे लिए प्रोग्रामेटिक रूप से जांचने का कोई तरीका है कि क्या एक्सेसिबिलिटी अनुमति मेरे ऐप के लिए उपलब्ध है?


डिवाइस बूट (ऑटोरन ऐप, आदि) पर सेवा कैसे शुरू करें

पहले के लिए: एंड्रॉइड 3.1+ संस्करण के बाद से आपको BOOT_COMPLETE प्राप्त नहीं होता है यदि उपयोगकर्ता ने कभी भी आपका ऐप कम से कम एक बार शुरू नहीं किया है या उपयोगकर्ता "बल बंद" एप्लिकेशन नहीं करता है। यह मालवेयर को स्वचालित रूप से रजिस्टर सेवा को रोकने के लिए किया गया था। यह सुरक्षा छेद Android के नए संस्करणों में बंद कर दिया गया था।

उपाय:

गतिविधि के साथ ऐप बनाएं। जब उपयोगकर्ता इसे चलाएगा तो एक बार एप्लिकेशन BOOT_COMPLETE प्रसारण संदेश प्राप्त कर सकता है।

दूसरे के लिए: बाहरी संग्रहण माउंट होने से पहले BOOT_COMPLETE भेजा जाता है। यदि एप्लिकेशन बाहरी संग्रहण में स्थापित है, तो इसे BOOT_COMPLETE प्रसारण संदेश प्राप्त नहीं होगा।

इस मामले में दो समाधान है:

  1. अपने ऐप को इंटरनल स्टोरेज में इंस्टॉल करें
  2. आंतरिक भंडारण में एक और छोटा ऐप इंस्टॉल करें। यह ऐप BOOT_COMPLETE को प्राप्त करता है और बाह्य संग्रहण पर दूसरा ऐप चलाता है।

यदि आपका ऐप पहले से ही आंतरिक भंडारण में स्थापित है, तो नीचे दिए गए कोड से आपको यह समझने में मदद मिल सकती है कि डिवाइस बूट पर सेवा कैसे शुरू करें।

मेनिफेस्ट.एक्सएमएल में

अनुमति:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

अपना BOOT_COMPLETED रिसीवर पंजीकृत करें:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

अपनी सेवा पंजीकृत करें:

<service android:name="org.yourapp.YourCoolService" />

रिसीवर OnBoot.java में:

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

अगर आपको डिवाइस RECEIVE_BOOT_COMPLETED नहीं पकड़ता है, तो HTC के लिए आपको शायद इस मेनिफेस्ट में भी जोड़ना होगा:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

रिसीवर अब इस तरह दिखता है:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

पुनः आरंभ एमुलेटर या वास्तविक डिवाइस के बिना BOOT_COMPLETED का परीक्षण कैसे करें? यह आसान है। इसे इस्तेमाल करे:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

डिवाइस आईडी कैसे प्राप्त करें? आईडी के साथ जुड़े उपकरणों की सूची प्राप्त करें:

adb devices

एडीबी में एडीबी डिफ़ॉल्ट रूप से आप में पा सकते हैं:

adt-installation-dir/sdk/platform-tools

का आनंद लें! )


मैं लगभग एक साल से इस मुद्दे से जूझ रहा हूं। अपने सभी एप्लिकेशन में, मैं अपने ऐप के लिए बैटरी ऑप्टिमाइज़ेशन को अक्षम करने के लिए उपयोगकर्ताओं को एक नोटिस दिखाता हूं।

वन प्लस डिवाइस पर बहुत सारे परीक्षण के बाद, मैं अपने एप्लिकेशन के लिए बैटरी ऑप्टिमाइज़ेशन बंद होने पर बूट पूरा प्रसारण प्राप्त करने में सक्षम हूं। मेरी राय में, यह ऊपर चर्चा की गई पहुँच सेवा से बहुत बेहतर है।

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

public void openPowerSettings(View v) {

    /* Make Sure to add below code to manifest
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    */

    try {
        Intent i = new Intent(android.provider.Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
        startActivityForResult(i, 1);
    }  catch (Exception e) {
        Log.e (TAG, "Exception: " + e.toString());
    }

}

और आप नीचे दिए गए फंक्शन के सही होने पर नोटिस को छिपा सकते हैं।

public static boolean is_ignoring_battery_optimizations(Context context) {
    String PACKAGE_NAME = context.getPackageName();
    PowerManager pm = (PowerManager) context.getSystemService(context.POWER_SERVICE);
    boolean status = true;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        status = pm.isIgnoringBatteryOptimizations(PACKAGE_NAME);
    }
    return status;
}

यहां आपके द्वारा बताए गए दोनों उपकरणों, OnePlus और Mi पर एक परीक्षण और काम करने वाला समाधान है।

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

मैंने देखा है कि यदि आपके ऐप में AccessibilityService है और इसे उपयोगकर्ता द्वारा चालू किया जाता है, तो आपका ऐप उस फ़िल्टर को पास करता है, जो ये निर्माता लागू करते हैं और ऐप इसे प्राप्त करता है और यह पूरी तरह से बूट होता है और किसी अन्य BroadcastReceiver अपेक्षा के अनुसार काम करता है।

इस ट्रिक की संभावित व्याख्या यह हो सकती है कि चूंकि AccessibilityService एक सिस्टम स्तर की सेवा है, इसलिए अपनी स्वयं की सेवा को पंजीकृत करके आप इन निर्माताओं द्वारा लागू किए गए निश्चित फ़िल्टर को पास कर रहे हैं और जैसे ही आपका कस्टम AccessibilityService OS द्वारा चालू हो जाता है, आपका ऐप सक्रिय हो जाता है पात्र BroadcastReceiver प्राप्त करने में जो आपने पंजीकृत किया था।

तो, यह कैसे करना है,

अपने AndroidManifest.xml इस अनुमति को जोड़कर शुरू करें,

<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/>

इससे आप अपने ऐप के AccessibilityService को सिस्टम के साथ रजिस्टर कर पाएंगे।

अब, अपने प्रोजेक्ट में अपने res फ़ोल्डर के अंतर्गत XML फ़ोल्डर के अंदर my_accessibility_service.xml उदाहरण के लिए एक फ़ाइल बनाकर अपने AccessibilityService लिए एक बहुत ही बुनियादी कॉन्फ़िगरेशन जोड़ें।

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:description="@string/service_desc"
    android:notificationTimeout="100"/>

ऐसा करने के लिए केवल एक और चरण शेष है, अपनी परियोजना में अपने कस्टम AccessibilityService को परिभाषित करें,

public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) { }

    @Override
    public void onInterrupt() {

    }
}

ध्यान दें, क्योंकि आपको इस वर्कअराउंड के बजाय किसी भी उद्देश्य के लिए AccessibilityService आवश्यकता नहीं है, आप ओवरराइड विधियों को खाली छोड़ सकते हैं।

अंत में, बस अपने AndroidManifest.xml में अपने AccessibilityService AndroidManifest.xml घोषणा करें,

<service
    android:name=".MyAccessibilityService"
    android:label="@string/app_name"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService"/>
    </intent-filter>

    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/my_accessibility_service"/>
</service>

बस इतना ही। अब आपके ऐप के भीतर, अपने यूज़र्स को सेटिंग्स से अपने ऐप के लिए एक्सेसिबिलिटी सर्विस चालू करने और इसे वॉयला पर छोड़ने के लिए कहें! आपका एप्लिकेशन सभी उपकरणों पर ठीक से काम करता है, यहां तक ​​कि जहां ओएस एक फिल्टर लगाता है, जिस पर एप्लिकेशन को बूट पर ऑटो-स्टार्ट होना चाहिए।

EDIT 1

यहाँ पर आप देख सकते हैं कि यदि एक्सेसिबिलिटी सेवा चालू है या नहीं, तो आपके ऐप के लिए,

private static final int ACCESSIBILITY_ENABLED = 1;

public static boolean isAccessibilitySettingsOn(Context context) {
    int accessibilityEnabled = 0;
    final String service = context.getPackageName() + "/" + MyAccessibilityService.class.getCanonicalName();
    try {
        accessibilityEnabled = Settings.Secure.getInt(
                context.getApplicationContext().getContentResolver(),
                android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
    } catch (Settings.SettingNotFoundException e) {
        Log.e("AU", "Error finding setting, default accessibility to not found: "
                + e.getMessage());
    }
    TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');

    if (accessibilityEnabled == ACCESSIBILITY_ENABLED) {
        String settingValue = Settings.Secure.getString(
                context.getApplicationContext().getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        if (settingValue != null) {
            mStringColonSplitter.setString(settingValue);
            while (mStringColonSplitter.hasNext()) {
                String accessibilityService = mStringColonSplitter.next();

                if (accessibilityService.equalsIgnoreCase(service)) {
                    return true;
                }
            }
        }
    }

    return false;
}

उम्मीद है की यह मदद करेगा।





android-broadcastreceiver