अनुमति डेनियल: startForeground को android.permission.FOREGROUND_SERVICE की आवश्यकता है


193

हाल ही में हम अचानक कुछ निम्नलिखित स्टैक के निशान देख रहे हैं। ऐसा क्यों हो सकता है? यह तब से है जब ऐप मीडिया अधिसूचना और सब कुछ के साथ एक ऑडियो कमेंट्री सेवा को अग्रभूमि में ले जाने की कोशिश करता है।

java.lang.SecurityException: Permission Denial: startForeground from pid=1824, uid=10479 requires android.permission.FOREGROUND_SERVICE
    at android.os.Parcel.createException(Parcel.java:1942)
    at android.os.Parcel.readException(Parcel.java:1910)
    at android.os.Parcel.readException(Parcel.java:1860)
    at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5198)
    at android.app.Service.startForeground(Service.java:695)
    at com.example.app.services.AudioService.setUpMediaNotification(AudioService.java:372)
    at com.example.app.services.AudioService.setUpAndStartAudioFeed(AudioService.java:328)
    at com.example.app.services.AudioService.onStartCommand(AudioService.java:228)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3667)
    at android.app.ActivityThread.access$1600(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.am.ActivityManagerService.enforcePermission(ActivityManagerService.java:9186)
    at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1189)
    at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:870)
    at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:20434)
    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:976)

जवाबों:


412

यह तब होगा जब आपने targetSdkVersion = 28(एंड्रॉइड 9 / पाई) सेट किया है या ऊपर और FOREGROUND_SERVICEअनुमति के उपयोग की घोषणा नहीं की है।

Android 9 के लिए माइग्रेशन नोट्स से :

अग्रभूमि सेवाओं का उपयोग करने के इच्छुक ऐप्स को पहले FOREGROUND_SERVICE अनुमति का अनुरोध करना चाहिए। यह एक सामान्य अनुमति है, इसलिए सिस्टम इसे स्वचालित रूप से अनुरोध करने वाले ऐप पर अनुदान देता है। अनुमति के बिना अग्रभूमि सेवा शुरू करना एक SecurityException को फेंकता है।

समाधान सिर्फ निम्नलिखित जोड़ने के लिए है AndroidManifest.xml:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>

8
क्या इसका मतलब यह है कि यदि हमारा targetSdkVersion28 से कम है, तो हमें 28 रन वाले उपकरणों में फोरग्राउंड सेवाओं को चलाने के लिए किसी अनुमति की आवश्यकता नहीं है?

3
यह मेरे लिए एक अजीब समाधान की तरह लगता है, लक्ष्य को कम करने के लिएविकास
डेनी

2
@ Sjd वे ठीक स्थापित करेंगे। यह ऐसा नहीं है maxSdkVersion
रॉय सोलबर्ग

9
अप-वोटिंग को अपना जवाब दें, लेकिन जारी नोट गैर-पिछड़े संगत एपीआई के निर्माण के लिए एक बहाना नहीं हैं। इस मामले में Google किसी उपयोगकर्ता को अनुमति देने या कम से कम ऐप को चुपचाप क्रैश करने के बजाय संकेत प्रदान करने के लिए कह सकता था। Android हाल ही में बनाए रखने के लिए बहुत मुश्किल हो जाता है।
ओलेग ग्रैब

2
@miladsalimi यदि आप Android Studio में AndroidManifest.xml खोलते हैं, तो आप "मर्ज किए गए मैनिफ़ेस्ट" को देखना चुन सकते हैं। हो सकता है कि एक निर्भरता है जो आपके लिए उस अनुमति के उपयोग को इंजेक्ट करती है?
रॉय सोलबर्ग

43

अनुमति डेनियल: startForeground को android.permission.FOREGROUND_SERVICE की आवश्यकता है

ऐसे ऐप्स जो Android 9 (API स्तर 28) या उससे उच्च को लक्षित करते हैं और अग्रभूमि सेवाओं का उपयोग करते हैं, उन्हें अनुरोध करना चाहिए FOREGROUND_SERVICE permission

इसलिए अब हमें मैनिफ़ेस्ट फ़ाइल में फ़ोरग्राउंड सेवा अनुमति जोड़ने की आवश्यकता है

  • यह एक नियमित अनुप्रयोग का उपयोग करने की अनुमति देता है Service.startForeground

नमूना

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

FOREGROUND_SERVICE एक सामान्य अनुमति है, इसलिए सिस्टम स्वचालित रूप से अनुरोध करने वाले ऐप को इसे अनुदान देता है।

एंड्रॉइड 9 / पाई के माइग्रेशन नोट्स की जांच करें

  • परिवर्तन

फोरग्राउंड सेवा की अनुमति

  • सारांश

अग्रभूमि सेवाओं का उपयोग करने के इच्छुक ऐप्स को पहले FOREGROUND_SERVICE अनुमति का अनुरोध करना चाहिए। यह एक सामान्य अनुमति है, इसलिए सिस्टम इसे स्वचालित रूप से अनुरोध करने वाले ऐप पर अनुदान देता है। अनुमति के बिना अग्रभूमि सेवा शुरू करना एक SecurityException को फेंकता है।

यह भी पढ़ें startForeground()

  • API को लक्षित करने वाले एप्लिकेशन Build.VERSION_CODES.Pया बाद Manifest.permission.FOREGROUND_SERVICEमें इस API का उपयोग करने के लिए अनुमति का अनुरोध करना चाहिए ।

महोदय, मैंने उर सॉल्यूशन की कोशिश की, लेकिन सभी एंड्रॉइड डिवाइसेज के लिए यह मेरे लिए काम नहीं कर रहा है। ओप्पो F11 प्रो में इसकी तरह काम कर रहा है, लेकिन सैमसंग, नोकिया और Mi फोन ऐप क्रैश हो गया है और log.can में एक ही त्रुटि मिली है। मुझे बताओ कि मैं क्या करता हूं ठीक कर?
कपिल सोनी

@ कपिलसोनी `को लॉग में एक ही त्रुटि हुई 'आपको क्या त्रुटि हो रही है
नीलेश राठौड़

मुझे यह त्रुटि मिली "android.app.RemoteServiceException: startForeground के लिए खराब सूचना:"
कपिल सोनी

8

API स्तर 28 या उच्चतर के लिए, इसे FOREGROUND_SERVICE अनुमति की आवश्यकता है। अन्यथा, यह नहीं चल सकता है और इसे अपवाद मिला।

इसे जोड़कर हल किया जाएगा

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

AndroidManifest.xml फ़ाइल में।


मैंने जोड़ा है लेकिन मेरे लिए तय नहीं किया है
कपिल सोनी

@Kapilsoni मेरे लिए एक ही मुद्दा है, लेकिन अभी भी एपीआई 29 पर अपर्याप्त अनुमति के कारण दुर्घटनाग्रस्त हो गया, क्या आपने इसे हल करने का प्रबंधन किया था?
आर्टुरम

4

एक targetSdkVersionकम से कम के 28Play स्टोर में ऐप अपडेट के लिए नवंबर 1 2019 से अनिवार्य हो जाएगा। इसलिए आपको लक्ष्य एपीआई बदलने की आवश्यकता होगी, और फिर FOREGROUND_SERVICEदुर्घटना से बचने के लिए अनुमति का अनुरोध करेंstartForeground()


0

यह देखते हुए कि FOREGROUND_SERVICEरनटाइम अनुमति की आवश्यकता नहीं है। केवल मैनिफ़ेस्ट में नीचे जोड़ें

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

उपरोक्त लाइन को पहले जोड़ा जाना चाहिए <application

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.