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




android-service android-permissions (2)

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

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)

अनुमति डेनियल: 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 लक्षित करने वाले ऐप्स। Build.VERSION_CODES.P या बाद में इस API का उपयोग करने के लिए अनुमति Manifest.permission.FOREGROUND_SERVICE अनुरोध करना चाहिए।

यह वही है जो आपको रिलीज नोट्स को ठीक से नहीं पढ़ने के लिए मिलता है। यह तब शुरू हुआ जब targetSdkVersion = 28 (एंड्रॉइड 9 / पाई) और यह स्पष्ट रूप से कहा गया है जैसे कि माइग्रेशन नोट्स :

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

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

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




android-permissions