SecurityException: ปฏิเสธการอนุญาต (ไม่มีสิทธิ์อินเทอร์เน็ต?)


94

ข้อผิดพลาดนี้แปลกมากจริงๆและฉันไม่รู้ว่าจะทำซ้ำได้อย่างไรและจะแก้ไขอย่างไรเพราะฉันทำการค้นหามากมาย แต่ไม่มีประโยชน์อะไรเลย

นี่คือ stacktrace:

Stack Trace
_________________________________
0   java.lang.RuntimeException: An error occured while executing doInBackground()
1       at android.os.AsyncTask$3.done(AsyncTask.java:299)
2       at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
3       at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
4       at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
5       at java.util.concurrent.FutureTask.run(FutureTask.java:137)
6       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
7       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
8       at java.lang.Thread.run(Thread.java:856)
9   Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
10      at java.net.InetAddress.lookupHostByName(InetAddress.java:430)
11      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
12      at java.net.InetAddress.getAllByName(InetAddress.java:214)
13      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
14      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
15      at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
16      at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
17      at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
18      at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
19      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
20      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
21      at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
22      at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
23      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
24      at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
25      at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
26      at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
27      at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
28      at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
29      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
30      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
31      at android.os.AsyncTask$2.call(AsyncTask.java:287)
32      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
33      ... 4 more
34  Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
35      at libcore.io.Posix.getaddrinfo(Native Method)
36      at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
37      at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
38      ... 26 more
39  Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
40      ... 29 more
41  java.lang.SecurityException: Permission denied (missing INTERNET permission?)
42      at java.net.InetAddress.lookupHostByName(InetAddress.java:430)
43      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
44      at java.net.InetAddress.getAllByName(InetAddress.java:214)
45      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
46      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
47      at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
48      at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
49      at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
50      at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
51      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
52      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
53      at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
54      at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
55      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
56      at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
57      at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
58      at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
59      at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
60      at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
61      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
62      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
63      at android.os.AsyncTask$2.call(AsyncTask.java:287)
64      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
65      at java.util.concurrent.FutureTask.run(FutureTask.java:137)
66      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
67      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
68      at java.lang.Thread.run(Thread.java:856)
69  Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
70      at libcore.io.Posix.getaddrinfo(Native Method)
71      at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
72      at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
73      ... 26 more
74  Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
75      ... 29 more
76  libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
77      at libcore.io.Posix.getaddrinfo(Native Method)
78      at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
79      at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
80      at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
81      at java.net.InetAddress.getAllByName(InetAddress.java:214)
82      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
83      at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
84      at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
85      at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
86      at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
87      at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
88      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
89      at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
90      at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
91      at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
92      at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
93      at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
94      at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
95      at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
96      at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
97      at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
98      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
99      at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
100     at android.os.AsyncTask$2.call(AsyncTask.java:287)
101     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
102     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
103     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
104     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
105     at java.lang.Thread.run(Thread.java:856)
106 Caused by: libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
107     ... 29 more
108 libcore.io.ErrnoException: getaddrinfo failed: EACCES (Permission denied)
109     at libcore.io.Posix.getaddrinfo(Native Method)
110     at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
111     at java.net.InetAddress.lookupHostByName(InetAddress.java:405)
112     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
113     at java.net.InetAddress.getAllByName(InetAddress.java:214)
114     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
115     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
116     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
117     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
118     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
119     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
120     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:461)
121     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
122     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
123     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
124     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
125     at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:185)
126     at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
127     at com.designfuture.music.api.MusixMatchApi.sendRequestJSON(MusixMatchApi.java:1143)
128     at com.designfuture.music.api.MusixMatchApi.handleRequestJSON(MusixMatchApi.java:982)
129     at com.designfuture.music.api.MusixMatchApi.getConfig(MusixMatchApi.java:211)
130     at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:28)
131     at com.designfuture.music.asynctask.GetConfigAsyncTask.doInBackground(GetConfigAsyncTask.java:1)
132     at android.os.AsyncTask$2.call(AsyncTask.java:287)
133     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
134     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
135     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
136     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
137     at java.lang.Thread.run(Thread.java:856)

นี่คือ AndroidManifest.xml ของฉัน

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my_app_package"
    android:installLocation="auto"
    android:versionCode="my_version_code"
    android:versionName="my_version_name" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true"
        android:xlargeScreens="true" />

    <uses-feature android:glEsVersion="0x00010001" />

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

    <application
        android:allowTaskReparenting="true"
        android:debuggable="true"
        android:icon="@drawable/mxm_icon"
        android:label="@string/musicbrowserlabel"
        android:theme="@style/Theme.Music" >

        <!-- MY ACTIVITIES -->



    </application>

</manifest>

โปรดอย่ารบกวนถามฉันว่าฉันได้รับอนุญาตอินเทอร์เน็ตที่ถูกต้องในรายการของฉันหรือไม่เพราะแอพนี้อยู่ในตลาดตั้งแต่ 2 ปี: P

ฉันสังเกตด้วยว่า (จาก Crittercism) ข้อบกพร่องทั้งหมดมาจากเวอร์ชัน Android 4.1.x (JB) ฉันไม่รู้ว่าอุปกรณ์ถูกรูทหรืออะไร (ฉันไม่เห็นข้อมูลนี้ในขณะนี้)


เป็นไปได้ไหมว่าชื่อโฮสต์มีการเปลี่ยนแปลง (เนื่องจากข้อความแสดงข้อผิดพลาดนี้): ไม่มีที่อยู่ที่เชื่อมโยงกับชื่อโฮสต์
Opiatefuchs

คุณได้ลองใช้อุปกรณ์รุ่นต่างๆหรือไม่ หรือรับในแต่ละเวอร์ชั่น?
Pankaj Kumar

1
โปรดเพิ่มแท็ก <ใช้ - อนุญาต android: name = "android.permission.INTERNET" /> <ใช้สิทธิ์ android: name = "android.permission.ACCESS_NETWORK_STATE" /> นอก <แอปพลิเคชัน> แท็กโปรดสร้างโครงการของคุณใหม่และเรียกใช้ มันใช้งานได้สำหรับฉัน
Azahar

By the way order เรื่องstackoverflow.com/questions/25135595/…
Nabin

@SteErMi คุณได้แก้ไขปัญหานี้แล้วหรือยังฉันกำลังเผชิญกับสถานการณ์เดียวกัน
Ravind Maurya

คำตอบ:


119

หมายเหตุ: ฉันเขียนคำตอบนี้ในเดือนมิถุนายน 2013 ดังนั้นในปัจจุบันจึงค่อนข้างล้าสมัย หลายสิ่งเปลี่ยนไปในแพลตฟอร์ม Android ตั้งแต่เวอร์ชัน 6 (Marshmallow) ทำให้ปัญหาทั้งหมดล้าสมัยมากขึ้น / น้อยลงในปัจจุบัน อย่างไรก็ตามฉันเชื่อว่าโพสต์นี้ยังควรค่าแก่การอ่านเป็นตัวอย่างแนวทางการวิเคราะห์ปัญหาทั่วไป


ข้อยกเว้นที่คุณได้รับ ( SecurityException: Permission denied (missing INTERNET permission?)) ระบุอย่างชัดเจนว่าคุณไม่ได้รับอนุญาตให้ทำเครือข่าย นั่นเป็นความจริงที่เถียงไม่ได้ แต่สิ่งนี้เกิดขึ้นได้อย่างไร? โดยปกติแล้วอาจเกิดจากการขาด<uses-permission android:name="android.permission.INTERNET" />รายการในAndroidManifest.xmlไฟล์ของคุณหรือเนื่องจากการอนุญาตทางอินเทอร์เน็ตได้รับเมื่อการติดตั้งไม่ใช่ในขณะทำงานเนื่องจากข้อผิดพลาดที่ไม่ได้รับในเฟรมเวิร์ก Android เป็นเวลานานซึ่งทำให้แอปของคุณติดตั้งสำเร็จ แต่ไม่ได้รับอนุญาตที่คาดไว้

ไฟล์ Manifest ของฉันถูกต้องแล้วเหตุการณ์นี้จะเกิดขึ้นได้อย่างไร

ในทางทฤษฎีการปรากฏตัวของuses-permissionใน Manifest ตอบสนองความต้องการได้อย่างสมบูรณ์แบบและจากมุมมองของนักพัฒนาคือสิ่งที่ต้องทำเพื่อให้สามารถสร้างเครือข่ายได้ ยิ่งไปกว่านั้นเนื่องจากการอนุญาตแสดงต่อผู้ใช้ระหว่างการติดตั้งการที่แอปของคุณสิ้นสุดการติดตั้งบนอุปกรณ์ของผู้ใช้หมายความว่าเขา / เขาให้สิ่งที่คุณขอ (มิฉะนั้นการติดตั้งจะถูกยกเลิก) ดังนั้นสมมติว่าหากรหัสของคุณถูกเรียกใช้การอนุญาตที่ร้องขอทั้งหมดจะ ได้รับนั้นถูกต้อง และเมื่อได้รับอนุญาตแล้วผู้ใช้จะไม่สามารถเพิกถอนการอนุญาตด้วยวิธีอื่นนอกจากการถอนการติดตั้งแอปอย่างสมบูรณ์เนื่องจากเฟรมเวิร์ก Android มาตรฐาน (จาก AOSP) ไม่มีคุณสมบัติดังกล่าวในขณะนี้

แต่สิ่งที่จะได้รับความยุ่งยากมากขึ้นถ้าคุณยังไม่ทราบของแอปที่ทำงานอยู่บนฝังรากอุปกรณ์เกินไป มีเครื่องมือที่มีอยู่ใน Google Play ที่ผู้ใช้ของคุณสามารถติดตั้งเพื่อควบคุมการอนุญาตที่มอบให้กับแอปที่ติดตั้งในขณะทำงานได้เช่นการปฏิเสธสิทธิ์และอื่น ๆ นอกจากนี้ยังสามารถทำได้ด้วยCyanogenModแบรนด์ของผู้ขาย (เช่น LG) หรือROM แบบกำหนดเองอื่น ๆ ที่มี "ผู้จัดการความเป็นส่วนตัว" ประเภทต่างๆหรือเครื่องมือที่คล้ายคลึงกัน

ดังนั้นหากแอปถูกบล็อกไม่ทางใดก็ทางหนึ่งผู้ใช้จะถูกบล็อกโดยเจตนาและถ้าเป็นเช่นนั้นก็จะเป็นปัญหาของผู้ใช้มากกว่าในกรณีนี้ (หรือเขา / เขาไม่เข้าใจว่าตัวเลือก / เครื่องมือบางอย่างทำอะไรได้จริงและผลที่ตามมาจะเป็นอย่างไร) มากกว่าของคุณเนื่องจาก SDK มาตรฐาน (และแอปส่วนใหญ่เขียนโดยคำนึงถึง SDK นั้น) ก็ไม่ได้ทำงานในลักษณะนั้น ดังนั้นฉันจึงสงสัยอย่างยิ่งว่าปัญหานี้เกิดขึ้นกับ ROM "มาตรฐาน" อุปกรณ์ที่ไม่ได้รูทพร้อมสต็อค (หรือผู้จำหน่ายเช่น Samsung, HTC, Sony และอื่น ๆ )

ไม่อยากพัง ...

การจัดการสิทธิ์และ / การบล็อกองค์กรที่ดำเนินการอย่างถูกต้องจะต้องจัดการกับข้อเท็จจริงที่ว่าแอปส่วนใหญ่อาจไม่พร้อมสำหรับสถานการณ์ที่มีทั้งการให้สิทธิ์และไม่สามารถเข้าถึงได้ในเวลาเดียวกันเนื่องจากเป็นความขัดแย้งที่แอปใช้ไฟล์ Manifest ในการ ร้องขอการเข้าถึงในเวลาติดตั้ง การควบคุมการเข้าถึงที่ทำถูกต้องควรทำให้ทุกสิ่งทำงานได้เหมือนเดิมและยังคง จำกัด การใช้งานโดยใช้เทคนิคในขอบเขตของลักษณะการทำงานที่คาดหวังของคุณลักษณะ ตัวอย่างเช่นเมื่อได้รับอนุญาตบางอย่าง (เช่น GPS, การเข้าถึงอินเทอร์เน็ต) คุณสมบัติดังกล่าวสามารถใช้งานได้จากมุมมองของแอป / ผู้ใช้ (เช่นคุณสามารถเปิด GPS หรือพยายามเชื่อมต่อ) การใช้งานที่เปลี่ยนแปลงจะไม่สามารถให้ข้อมูลจริงได้ - เช่น GPS ไม่สามารถส่งคืนพิกัดได้เสมอเช่นเมื่อคุณอยู่ในร่มหรือไม่มีดาวเทียม "แก้ไข" สามารถให้สิทธิ์การเข้าถึงอินเทอร์เน็ตได้เหมือนเดิม แต่คุณไม่สามารถทำการเชื่อมต่อได้สำเร็จเนื่องจากไม่มีการครอบคลุมข้อมูลหรือการกำหนดเส้นทาง สถานการณ์ดังกล่าวควรได้รับการคาดหวังในการใช้งานปกติเช่นกันดังนั้นแอปจึงควรจัดการอยู่แล้ว เนื่องจากสิ่งนี้สามารถเกิดขึ้นได้ในระหว่างการใช้งานปกติทุกวันความผิดพลาดในสถานการณ์ดังกล่าวน่าจะเกี่ยวข้องกับข้อบกพร่องของแอปพลิเคชันมากที่สุด

เราขาดข้อมูลมากเกินไปเกี่ยวกับสภาพแวดล้อมที่ปัญหานี้เกิดขึ้นเพื่อวินิจฉัยปัญหาโดยไม่ต้องคาดเดา แต่เป็นวิธีการแก้ปัญหาคุณอาจพิจารณาใช้setDefaultUncaughtExceptionHandler ()เพื่อตรวจจับข้อยกเว้นที่ไม่คาดคิดดังกล่าวในอนาคตและกล่าวคือเพียงแค่แสดงข้อมูลโดยละเอียดของผู้ใช้ว่าอนุญาตใด แอปของคุณต้องการแทนที่จะหยุดทำงาน โปรดทราบว่าการใช้สิ่งนี้มักจะขัดแย้งกับเครื่องมือเช่น Crittercism, ACRA และอื่น ๆ ดังนั้นโปรดใช้ความระมัดระวังหากคุณใช้สิ่งเหล่านี้

หมายเหตุ

โปรดทราบว่าandroid.permission.INTERNETไม่ใช่การอนุญาตที่เกี่ยวข้องกับเครือข่ายเพียงอย่างเดียวที่คุณอาจต้องประกาศในรายการเพื่อพยายามสร้างเครือข่ายให้สำเร็จ การINTERNETได้รับอนุญาตเพียงแค่อนุญาตให้แอปพลิเคชันเปิดซ็อกเก็ตเครือข่าย (ซึ่งโดยพื้นฐานแล้วเป็นข้อกำหนดพื้นฐานในการถ่ายโอนข้อมูลเครือข่าย) แต่ในกรณีที่เครือข่ายสแต็ก / ไลบรารีของคุณต้องการรับข้อมูลเกี่ยวกับเครือข่ายด้วยเช่นกันคุณจะต้องใช้android.permission.ACCESS_NETWORK_STATEManifest ของคุณด้วย (ซึ่งไคลเอ็นต์HttpUrlConnectionจำเป็นต้องใช้เช่นกัน ( ดูบทช่วยสอน )


ภาคผนวก (2015-07-16)

โปรดทราบว่า Android 6 (aka Marshmallow) แนะนำกลไกการจัดการได้รับอนุญาตใหม่ที่สมบูรณ์แบบที่เรียกว่าRuntime สิทธิ์ ช่วยให้ผู้ใช้สามารถควบคุมสิ่งที่ได้รับอนุญาตได้มากขึ้น (ยังอนุญาตให้ใช้สิทธิ์แบบเลือกได้) หรืออนุญาตให้เพิกถอนสิทธิ์ที่ได้รับแล้วโดยไม่จำเป็นต้องลบแอป:

[... ] นี้จะแนะนำรูปแบบการอนุญาตแบบใหม่ซึ่งตอนนี้ผู้ใช้สามารถจัดการสิทธิ์ของแอพได้โดยตรงที่รันไทม์ รุ่นนี้ช่วยให้ผู้ใช้สามารถมองเห็นและควบคุมสิทธิ์ได้ดีขึ้นในขณะที่ปรับปรุงกระบวนการติดตั้งและอัปเดตอัตโนมัติสำหรับนักพัฒนาแอป ผู้ใช้สามารถให้หรือเพิกถอนการอนุญาตเป็นรายบุคคลสำหรับแอปที่ติดตั้ง

อย่างไรก็ตามการเปลี่ยนแปลงจะไม่ส่งผลกระทบINTERNETหรือACCESS_NETWORK_STATEสิทธิ์ซึ่งถือเป็นสิทธิ์ "ปกติ" ผู้ใช้ไม่จำเป็นต้องให้สิทธิ์เหล่านี้อย่างชัดเจน

ดูรายละเอียดในหน้าคำอธิบายการเปลี่ยนแปลงพฤติกรรมและตรวจสอบให้แน่ใจว่าแอปของคุณทำงานอย่างถูกต้องในระบบใหม่ ๆ เป็นสิ่งสำคัญอย่างยิ่งเมื่อโครงการของคุณตั้งค่าtargetSdkเป็นอย่างน้อย23คุณต้องรองรับรูปแบบการอนุญาตใหม่ ( เอกสารโดยละเอียด ) หากคุณยังไม่พร้อมที่จะให้แน่ใจว่าคุณให้targetSdkไปที่ส่วนใหญ่22เป็นความมั่นใจว่านี้ใหม่ Android จะใช้ระบบรับอนุญาตเก่าเมื่อแอปของคุณมีการติดตั้ง


นี่หมายความว่าเขาไม่ได้รับอนุญาตให้ทำเครือข่าย ทั้งไม่ได้ร้องขอในรายการหรือไม่ได้รับอนุญาตจากแพลตฟอร์ม (ซึ่งสามารถทำได้เช่นบนอุปกรณ์ที่รูท)
Marcin Orlowski

2
เพิ่มคะแนนคำตอบนี้เพื่อยกเลิกการลดคะแนนจากคนอื่น ตอนแรกฉันคิดว่าคุณไม่ได้อ่านคำถามทั้งหมดและแค่อยากจะเร็ว (อย่างไรก็ตามคำตอบของคุณสั้นเกินไปในตอนแรก ;-)) แต่ฉันคิดว่าข้อสังเกตเกี่ยวกับผู้ใช้ (บนอุปกรณ์ที่รูท) ความสามารถในการขัดขวางคำขออนุญาตของคุณเป็นสิ่งที่ดี
baske

อืมดังนั้นหากนี่มาจากผู้ใช้รูทที่กำลังลบสิทธิ์ฉันมี 2 คำถาม: 1) ฉันจะรู้ได้อย่างไรว่าฉันไม่ได้รับอนุญาตนั้น? 2) ฉันจะถามมันอีกครั้งได้อย่างไร? (แต่ฉันไม่รู้ว่าเรากำลังพูดถึงปัญหาประเภทนี้อยู่หรือ
เปล่า

คุณไม่สามารถขอได้อีกเนื่องจากไม่ได้ให้สิทธิ์นี้ในรันไทม์ ดูคำตอบที่แก้ไขสำหรับ "วิธีแก้ปัญหา" ที่เป็นไปได้
Marcin Orlowski

1
เหมือนกันที่นี่: ฉันกำลังจะปรับลดรุ่น แต่ส่วนที่สองของ anwswer ดูเหมือนจะเป็นส่วนที่ควรค่าแก่การอ่าน :) คุณควรลบบรรทัดแรกของคำตอบเนื่องจาก StErMi แสดงให้เห็นอย่างชัดเจนว่าเขาได้ตั้งค่าการอนุญาตอินเทอร์เน็ต
Thierry

43

ตรวจสอบให้แน่ใจว่าสถานที่ที่คุณเพิ่ม

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

ถูกต้อง

คุณควรเขียนเช่นนั้นใน AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.project"> 
<uses-permission android:name="android.permission.INTERNET"/>

อย่าทำผิดพลาด :)


33

Android สตูดิโอ 1.3b1 (ไม่แน่ใจเกี่ยวกับรุ่นอื่น ๆ ) ANDROID.PERMISSION.INTERNETเติมข้อความอัตโนมัติได้รับอนุญาตอินเทอร์เน็ตของฉันไป การเปลี่ยนเพื่อandroid.permission.INTERNETแก้ไขปัญหา


ตอนนี้ควรได้รับการแก้ไขแล้วใน Android Studio 1.4 RC 1 (ปัจจุบันอยู่ในช่อง Canary)
ทอม

31

เพิ่มในไฟล์ manifest บรรทัด:

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

มันแก้ไขให้ฉัน


20

ฉันแก้ไขข้อผิดพลาดนี้ฉันกำลังเพิ่มสิทธิ์ในแท็กแอปพลิเคชันโดยไม่ได้ตั้งใจ ฉันวางไว้ข้างนอกและทำงานได้ดี หวังว่าจะช่วยให้ใครบางคน


16

ฉันก็มีปัญหานี้เช่นกัน มันแปลกที่มันใช้งานได้กับโปรแกรมจำลองอมยิ้มของฉัน แต่ไม่ใช่ในอุปกรณ์ kitkat จริงของฉัน

ตอนนี้ Android Studio จะบังคับให้คุณเขียนตัวพิมพ์ใหญ่ของสิทธิ์และนั่นคือปัญหา

เพิ่ม

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

เหนือแท็บแอปพลิเคชันและจะใช้งานได้


นี่คือคำตอบที่ง่ายและถูกต้อง และน่าจะเป็นอันดับต้น ๆ !
Kostanos

14

เขียนการอนุญาตของคุณก่อนแท็กแอปพลิเคชันตามที่ระบุด้านล่าง

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

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

นี่เป็นสิ่งเดียวที่ช่วยฉันได้จริง :( ไม่เข้าใจง่ายเลย
Ivan Perez

4

วางการอนุญาตเหล่านี้ไว้นอก<application>แท็กก่อนแท็กฉันลองแล้วและใช้ได้ผล

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


2

เช่นเดียวกับที่ทอมกล่าวถึง เมื่อคุณเริ่มต้นด้วยตัวพิมพ์ใหญ่การAเติมข้อความอัตโนมัติจะทำให้สมบูรณ์ในรูปแบบ

ANDROID.PERMISSION.INTERNET

เมื่อคุณเริ่มพิมพ์ด้วยการaเติมข้อความอัตโนมัติจะทำให้เสร็จสมบูรณ์โดย

android.permission.INTERNET

อันที่สองคืออันที่ถูกต้อง


2

ฉันใช้เวลาหลายชั่วโมงในการค้นหาวิธีแก้ปัญหานี้และไม่มีวิธีใดในคำตอบที่ได้ผล จากนั้นฉันก็พบว่าฉันบังเอิญเพิ่มช่องว่างระหว่างการเติมข้อความอัตโนมัติระหว่างandroid.permission.INTERNETและ"


0

มันเป็นจุดบกพร่องที่น่าสับสนมาก อาจมีสาเหตุหลายประการ:

  1. คุณไม่ได้กล่าวถึงสิทธิ์ในตำแหน่งที่ถูกต้อง เช่นเดียวกับแอปพลิเคชันด้านบน
  2. คุณไม่ได้ใช้ตัวอักษรขนาดเล็ก
  3. ในบางกรณีคุณต้องเพิ่มการอนุญาตสถานะเครือข่ายด้วย
  4. หนึ่งในกรณีของฉันมีบรรทัดว่างบางบรรทัดในรายการ เช่นอาจมีบรรทัดว่างระหว่างแท็กสิทธิ์และแอปพลิเคชันไลน์ ลบออกและคุณทำเสร็จแล้ว หวังว่ามันจะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.