SecurityException: Quyền bị từ chối (thiếu quyền INTERNET?)


92

lỗi này thực sự rất lạ và tôi không biết làm thế nào để tạo lại nó và làm thế nào để sửa chữa nó vì tôi đã tìm kiếm rất nhiều nhưng không có gì là hữu ích.

Đây là 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)

Đây là AndroidManifest.xml của tôi

<?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>

Vui lòng không hỏi tôi xem tôi có quyền INTERNET chính xác trong tệp kê khai của mình hay không vì ứng dụng này đã có mặt trên thị trường từ 2 năm nay: P

Tôi cũng nhận thấy rằng (từ Crittercism) tất cả các lỗi đều đến từ phiên bản Android 4.1.x (JB). Tôi không biết liệu thiết bị đã được root hay chưa (tôi không thể xem thông tin này vào lúc này)


là nó có thể là tên máy đã thay đổi (vì thông báo lỗi này): Không có địa chỉ liên kết với hostname
Opiatefuchs

bạn đã thử với các phiên bản thiết bị khác nhau chưa? hoặc nhận được trên mỗi phiên bản?
Pankaj Kumar

1
làm ơn thêm thẻ <use-allow android: name = "android.permission.INTERNET" /> <use-allow android: name = "android.permission.ACCESS_NETWORK_STATE" /> Bên ngoài <Application> Vui lòng xây dựng lại dự án của bạn và chạy. nó đã làm việc cho tôi
Azahar

Nhân tiện, thứ tự quan trọng, stackoverflow.com/questions/25135595/…
Nabin

@SteErMi có bạn giải quyết vấn đề này, tôi đang phải đối mặt với tình huống tương tự
Ravind Maurya

Câu trả lời:


118

LƯU Ý: Tôi đã viết câu trả lời này vào tháng 6 năm 2013, vì vậy ngày nay nó hơi lỗi thời. Nhiều thứ đã thay đổi trong nền tảng Android kể từ phiên bản 6 (Marshmallow), khiến toàn bộ vấn đề ngày nay trở nên lỗi thời hơn / ít hơn. Tuy nhiên, tôi tin rằng bài đăng này vẫn có thể đáng đọc như ví dụ về cách tiếp cận phân tích vấn đề chung.


Ngoại lệ bạn đang nhận được ( SecurityException: Permission denied (missing INTERNET permission?)), chỉ rõ rằng bạn không được phép thực hiện kết nối mạng. Đó là sự thật không thể chối cãi. Nhưng làm thế nào điều này có thể xảy ra? Thông thường, đó là do thiếu <uses-permission android:name="android.permission.INTERNET" />mục nhập trong AndroidManifest.xmltệp của bạn hoặc do quyền truy cập internet được cấp khi cài đặt không phải lúc chạy, do lỗi lâu dài, bị bỏ sót trong khuôn khổ Android khiến ứng dụng của bạn được cài đặt thành công nhưng không được cấp quyền như mong đợi.

Manifest của tôi là chính xác, vậy làm thế nào điều này có thể xảy ra?

Về mặt lý thuyết, sự hiện diện của uses-permissiontrong Manifest đáp ứng hoàn hảo yêu cầu và từ quan điểm của nhà phát triển là tất cả những gì cần làm để có thể kết nối mạng. Hơn nữa, vì quyền được hiển thị cho người dùng trong quá trình cài đặt, việc ứng dụng của bạn kết thúc được cài đặt trên thiết bị của người dùng có nghĩa là họ đã cấp những gì bạn yêu cầu (nếu không, quá trình cài đặt sẽ bị hủy), vì vậy giả sử rằng nếu mã của bạn được thực thi thì tất cả các quyền được yêu cầu sẽ được cấp là hợp lệ. Và sau khi được cấp, người dùng không thể thu hồi quyền theo cách khác ngoài việc gỡ cài đặt ứng dụng hoàn toàn vì khung Android tiêu chuẩn (từ AOSP) hiện không cung cấp tính năng như vậy.

Nhưng mọi thứ đang trở nên phức tạp hơn nếu bạn cũng không ngại ứng dụng của mình chạy trên các thiết bị đã root . Có các công cụ có sẵn trong Google Play mà người dùng của bạn có thể cài đặt để kiểm soát quyền được cấp cho các ứng dụng đã cài đặt tại thời điểm chạy - ví dụ: Quyền bị Từ chối và các quyền khác. Điều này cũng có thể được thực hiện với CyanogenMod , thương hiệu của nhà cung cấp (tức là của LG) hoặc ROM tùy chỉnh khác , có nhiều loại "quản lý quyền riêng tư" hoặc các công cụ tương tự.

Vì vậy, nếu ứng dụng bị chặn theo cả hai cách, về cơ bản nó bị người dùng cố ý chặn và nếu vậy, nó thực sự là vấn đề người dùng nhiều hơn trong trường hợp này (hoặc anh ấy / anh ấy không hiểu những tùy chọn / công cụ nhất định thực sự làm gì và hậu quả sẽ là gì) hơn của bạn, bởi vì SDK tiêu chuẩn (và hầu hết các ứng dụng được viết với SDK đó) đơn giản là không hoạt động theo cách đó. Vì vậy, tôi mạnh mẽ nghi ngờ vấn đề này xảy ra trên "tiêu chuẩn", thiết bị không cắm rễ với chứng khoán (hoặc nhà cung cấp như Samsung, HTC, Sony vv) ROM.

Tôi không muốn sụp đổ ...

Việc quản lý quyền và / tổ chức chặn được triển khai đúng cách phải giải quyết được thực tế là hầu hết các ứng dụng có thể không sẵn sàng cho trường hợp quyền truy cập vào các tính năng nhất định được cấp và không thể truy cập cùng một lúc, vì đây là loại mâu thuẫn khi ứng dụng sử dụng tệp kê khai để yêu cầu quyền truy cập tại thời điểm cài đặt. Quyền kiểm soát truy cập được thực hiện phải làm cho mọi thứ hoạt động như trước và vẫn hạn chế khả năng sử dụng bằng cách sử dụng các kỹ thuật trong phạm vi hoạt động mong đợi của đối tượng địa lý. Ví dụ: khi một số quyền nhất định được cấp (tức là GPS, truy cập Internet), tính năng đó có thể được cung cấp từ góc độ ứng dụng / người dùng (tức là bạn có thể bật GPS hoặc cố gắng kết nối), việc triển khai đã thay đổi có thể không cung cấp dữ liệu thực - tức là GPS luôn có thể trả về không có tọa độ, như khi bạn ở trong nhà hoặc không có vệ tinh "sửa chữa". Quyền truy cập Internet có thể được cấp như trước đây, nhưng bạn không thể thực hiện kết nối thành công vì không có vùng phủ sóng hoặc định tuyến dữ liệu. Các tình huống như vậy cũng nên được mong đợi trong việc sử dụng bình thường, do đó, nó sẽ được xử lý bởi các ứng dụng. Vì điều này đơn giản có thể xảy ra trong quá trình sử dụng bình thường hàng ngày, bất kỳ sự cố nào trong tình huống như vậy rất có thể liên quan đến lỗi ứng dụng.

Chúng tôi thiếu quá nhiều thông tin về môi trường mà sự cố này xảy ra để chẩn đoán sự cố có thể đoán được sự cố, nhưng như một giải pháp, bạn có thể cân nhắc sử dụng setDefaultUncaughtExceptionHandler () để nắm bắt các trường hợp ngoại lệ không mong muốn như vậy trong tương lai và tức là chỉ cần hiển thị thông tin chi tiết cho người dùng quyền nào ứng dụng của bạn cần thay vì chỉ gặp sự cố. Xin lưu ý rằng việc sử dụng điều này rất có thể sẽ xung đột với các công cụ như Crittercism, ACRA và những công cụ khác, vì vậy hãy cẩn thận nếu bạn sử dụng bất kỳ công cụ nào trong số này.

Ghi chú

Xin lưu ý rằng đó android.permission.INTERNETkhông phải là quyền duy nhất liên quan đến mạng mà bạn có thể cần phải khai báo trong tệp kê khai để cố gắng kết nối mạng thành công. Việc INTERNETđược cấp quyền chỉ đơn giản là cho phép các ứng dụng mở các ổ cắm mạng (về cơ bản là yêu cầu cơ bản để thực hiện bất kỳ quá trình truyền dữ liệu mạng nào). Nhưng trong trường hợp ngăn xếp / thư viện mạng của bạn cũng muốn lấy thông tin về các mạng, thì bạn cũng cần có android.permission.ACCESS_NETWORK_STATEtrong Tệp kê khai của mình (tức là ứng dụng khách HttpUrlConnection yêu cầu ( xem hướng dẫn ).


Phụ lục (2015-07-16)

Xin lưu ý rằng Android 6 (hay còn gọi là Marshmallow) đã giới thiệu cơ chế quản lý quyền hoàn toàn mới được gọi là Runtime Permissions . Nó cho phép người dùng kiểm soát nhiều hơn đối với những quyền nào được cấp (cũng cho phép cấp có chọn lọc) hoặc cho phép một người thu hồi các quyền đã được cấp mà họ cần xóa ứng dụng:

[...] này giới thiệu một mô hình quyền mới, nơi người dùng hiện có thể trực tiếp quản lý các quyền của ứng dụng trong thời gian chạy. Mô hình này giúp người dùng cải thiện khả năng hiển thị và kiểm soát quyền, đồng thời hợp lý hóa quy trình cài đặt và tự động cập nhật cho các nhà phát triển ứng dụng. Người dùng có thể cấp hoặc thu hồi quyền riêng lẻ cho các ứng dụng đã cài đặt.

Tuy nhiên, các thay đổi không ảnh hưởng INTERNEThoặc các ACCESS_NETWORK_STATEquyền, được coi là các quyền "Bình thường". Người dùng không cần phải cấp các quyền này một cách rõ ràng.

Xem trang mô tả thay đổi hành vi để biết chi tiết và đảm bảo rằng ứng dụng của bạn cũng sẽ hoạt động chính xác trên các hệ thống mới hơn. Điều đặc biệt quan trọng là khi dự án của bạn được đặt thành targetSdkít nhất 23là khi đó bạn phải hỗ trợ mô hình quyền mới ( tài liệu chi tiết ). Nếu bạn chưa sẵn sàng, hãy đảm bảo bạn luôn duy trì targetSdktối đa 22vì điều này đảm bảo ngay cả Android mới cũng sẽ sử dụng hệ thống quyền cũ khi ứng dụng của bạn được cài đặt.


Điều này rõ ràng có nghĩa là anh ta không được phép thực hiện mạng. Nó có thể không được yêu cầu trong Manifest hoặc không được cấp bởi nền tảng (có thể được thực hiện tức là trên các thiết bị đã root).
Marcin Orlowski

2
Đã tán thành câu trả lời này để hoàn tác phản đối từ người khác. Lúc đầu, tôi nghĩ rằng bạn thực sự đã không đọc toàn bộ câu hỏi và chỉ muốn nhanh (nhân tiện, câu trả lời của bạn thực sự là quá ngắn lúc đầu ;-)), nhưng tôi nghĩ nhận xét về người dùng (trên thiết bị đã root) có thể ngăn cản các yêu cầu cấp phép của bạn là một điều tốt.
baske

Mmmm vậy nếu đây là từ người dùng root đang xóa quyền, tôi có 2 câu hỏi: 1) làm sao tôi có thể biết nếu tôi không có quyền đó? 2) Tôi có thể hỏi lại nó như thế nào? (vẫn còn, tôi không biết nếu chúng ta đang nói về các loại vấn đề)
StErMi

Bạn không thể yêu cầu lại vì quyền này không được cấp trong thời gian chạy. Xem câu trả lời đã chỉnh sửa để biết "giải pháp" khả thi
Marcin Orlowski

1
Tương tự ở đây: tôi đã chuẩn bị hạ cấp nhưng phần thứ hai của anwswer có vẻ là phần đáng đọc :) bạn nên xóa dòng đầu tiên của câu trả lời vì StErMi đã cho thấy rõ ràng rằng anh ấy đã đặt quyền INTERNET.
Thierry

43

Hãy chắc chắn rằng nơi bạn thêm

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

đúng.

Bạn nên viết nó như vậy trong AndroidManifest.xml:

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

Đừng mắc lỗi của tôi :)


33

Android Studio 1.3b1 (không chắc chắn về các phiên bản khác) đã tự động hoàn thành quyền truy cập Internet của tôi ANDROID.PERMISSION.INTERNET. Thay đổi nó để android.permission.INTERNETkhắc phục sự cố.


Điều này hiện sẽ được khắc phục trong Android Studio 1.4 RC 1 (hiện có trong kênh Canary).
Tom

30

Thêm vào tệp kê khai dòng:

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

Nó đã sửa nó cho tôi.


20

Tôi đã giải quyết lỗi này, tôi đã thêm quyền vào bên trong thẻ Ứng dụng do nhầm lẫn. Tôi đã đặt bên ngoài và nó hoạt động tốt. Hy vọng nó sẽ giúp ích cho ai đó.


16

Tôi cũng đã từng gặp phải vấn đề này. thật kỳ lạ khi nó hoạt động trên trình giả lập kẹo mút của tôi, nhưng không hoạt động trên thiết bị kitkat thực tế của tôi.

Android Studio bây giờ sẽ buộc bạn phải viết chữ hoa cho phép và đó là vấn đề.

Thêm vào

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

Phía trên tab ứng dụng và nó sẽ hoạt động.


Đây là câu trả lời đơn giản và chính xác. Và nên là một trong những trên đầu!
Kostanos

13

Viết quyền của bạn trước thẻ ứng dụng như được cung cấp bên dưới.

<?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">

Đây thực sự là điều duy nhất giúp tôi :( Không trực quan chút nào.
Ivan Perez

4

Đặt các quyền này bên ngoài <application>thẻ thích hợp hơn trước thẻ, tôi đã thử và nó phù hợp với tôi.

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


2

Đúng như Tom đã đề cập. Khi bạn bắt đầu với số vốn Asau đó tự động hoàn thành sẽ hoàn thành nó như.

ANDROID.PERMISSION.INTERNET

Khi bạn bắt đầu nhập bằng athì tự động hoàn thành sẽ hoàn thành nó như

android.permission.INTERNET

Cái thứ hai là cái chính xác.


2

Tôi dành hàng giờ để tìm giải pháp cho vấn đề này và không giải pháp nào trong các câu trả lời hiệu quả. Sau đó, tôi phát hiện ra rằng tôi đã vô tình thêm một khoảng trắng trong quá trình tự động hoàn thành giữa android.permission.INTERNET"


0

Đó là một loại lỗi rất khó hiểu. Có thể có nhiều lý do:

  1. Bạn không đề cập đến các quyền ở đúng nơi. Giống như ngay trên ứng dụng.
  2. Bạn không sử dụng các chữ cái nhỏ.
  3. Trong một số trường hợp, bạn cũng phải thêm quyền trạng thái Mạng.
  4. Đó là trường hợp của tôi, có một số dòng trống trong các dòng kê khai. Giống như có thể có một dòng trống giữa thẻ quyền và dòng ứng dụng. Loại bỏ chúng và bạn đã hoàn tất. Hy vọng nó sẽ giúp ích

-7

xóa cái này trong tệp kê khai của bạn

 xmlns:tools="http://schemas.android.com/tools"

Không có mã như vậy trong tệp kê khai (AndroidManifest.xml) trong câu hỏi.
Pang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.