Pertanyaan SecurityException: Izin ditolak (kehilangan izin INTERNET?)


kesalahan ini benar-benar sangat aneh dan saya tidak tahu cara mereproduksi dan cara memperbaikinya karena saya membuat banyak pencarian tetapi tidak ada yang berguna.

Inilah 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)

Inilah AndroidManifest.xml saya

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

Tolong jangan repot-repot bertanya kepada saya apakah saya memiliki izin INTERNET yang benar dalam manifes saya karena aplikasi ini ada di pasar sejak 2 tahun: P

Saya juga memperhatikan bahwa (dari Crittercism) semua bug berasal dari Android 4.1.x versi (JB). Saya tidak tahu apakah perangkat di-root atau apa (saya tidak dapat melihat informasi ini untuk saat ini)


75
2018-06-28 08:58


asal


Jawaban:


CATATAN: Saya menulis jawaban ini pada Juni 2013, jadi sekarang sedikit tertanggal. Beberapa hal berubah di Android sejak versi 6 (Marshmallow) platform sejak saat itu, membuat seluruh masalah lebih / kurang usang saat ini. Namun saya yakin posting ini masih layak dibaca sebagai contoh analisis masalah umum, jadi saya harap Anda masih dapat menemukannya sebagai pendidikan.


Pengecualian yang Anda dapatkan (SecurityException: Permission denied (missing INTERNET permission?)), jelas menunjukkan bahwa Anda tidak diizinkan untuk melakukan networking. Itu fakta yang tak terbantahkan. Tapi bagaimana ini bisa terjadi? Biasanya karena hilang <uses-permission android:name="android.permission.INTERNET" /> masuk di Anda AndroidManifest.xml file atau, karena izin internet diberikan pada saat instalasi tidak pada waktu berjalan, dengan berdiri lama, kesalahan bug dalam kerangka Android yang menyebabkan aplikasi Anda berhasil diinstal, tetapi tanpa izin izin yang diharapkan.

Manifes saya benar, jadi bagaimana ini bisa terjadi?

Secara teoritis, kehadiran uses-permission dalam Manifes memenuhi dengan sempurna persyaratan dan dari sudut pandang pengembang adalah semua yang perlu dilakukan untuk dapat melakukan jaringan. Selain itu, karena izin ditampilkan kepada pengguna selama instalasi, fakta aplikasi Anda berakhir diinstal pada perangkat pengguna berarti s / dia memberikan apa yang Anda minta (jika tidak instalasi dibatalkan), sehingga asumsi bahwa jika kode Anda dijalankan maka semua izin yang diminta adalah yang diberikan adalah valid. Dan setelah diberikan, pengguna tidak dapat mencabut izin dengan cara lain daripada mencopot pemasangan aplikasi sepenuhnya karena kerangka standar Android (dari AOSP) tidak menawarkan fitur seperti itu saat ini.

Tetapi hal-hal menjadi semakin rumit jika Anda juga tidak keberatan menjalankan aplikasi Anda berakar perangkat juga. Ada alat yang tersedia di Google Play yang dapat dipasang oleh pengguna Anda untuk mengontrol izin yang diberikan untuk aplikasi yang dipasang pada saat run-time - sebagai contoh: Izin Ditolak dan lain-lain. Ini juga bisa dilakukan dengan CyanogenMod, merek vendor (yaitu LG) atau ROM kustom lainnya, menampilkan berbagai jenis "pengelola privasi" atau alat serupa.

Jadi jika aplikasi diblokir dengan cara apa pun, itu pada dasarnya diblokir secara sengaja oleh pengguna dan jika demikian, itu benar-benar lebih banyak masalah pengguna dalam kasus ini (atau dia tidak mengerti apa yang benar-benar dilakukan oleh opsi / alat tertentu dan apa konsekuensinya) daripada milik Anda, karena SDK standar (dan sebagian besar aplikasi ditulis dengan mengingat SDK itu) tidak berperilaku seperti itu. Jadi saya dengan kuat keraguan masalah ini terjadi pada "standar", perangkat yang tidak di-root dengan stok (atau vendor seperti Samsung, HTC, Sony dll) ROM.

Saya tidak ingin crash ...

Penerapan pengelolaan izin dan / pemblokiran org yang benar harus menghadapi kenyataan bahwa sebagian besar aplikasi mungkin tidak siap untuk situasi di mana akses ke fitur tertentu diberikan dan tidak dapat diakses pada saat yang sama, karena ini adalah jenis kontradiksi di mana aplikasi menggunakan manifes untuk meminta akses pada waktu pemasangan. Kontrol akses yang dilakukan dengan benar harus membuat semua hal bekerja seperti sebelumnya, dan masih membatasi kegunaan menggunakan teknik dalam lingkup perilaku yang diharapkan dari fitur tersebut. Misalnya, ketika izin tertentu diberikan (yaitu GPS, akses Internet) fitur tersebut dapat dibuat tersedia dari perspektif aplikasi / pengguna (yaitu Anda dapat mengaktifkan GPS. Atau mencoba untuk menghubungkan), implementasi yang diubah tidak dapat menyediakan data nyata - yaitu GPS dapat selalu mengembalikan koordinat, seperti ketika Anda di dalam ruangan atau tidak memiliki "perbaikan" satelit. Akses internet dapat diberikan seperti sebelumnya, tetapi Anda tidak dapat membuat koneksi yang sukses karena tidak ada cakupan atau perutean data. Skenario seperti itu harus diharapkan dalam penggunaan normal juga, oleh karena itu harus ditangani oleh aplikasi yang sudah ada. Karena ini hanya dapat terjadi selama penggunaan normal setiap hari, setiap kecelakaan dalam situasi seperti itu kemungkinan besar terkait dengan bug aplikasi.

Kami tidak memiliki terlalu banyak informasi tentang lingkungan di mana masalah ini terjadi untuk mendiagnosis masalah tanpa menebak, tetapi sebagai solusi, Anda dapat mempertimbangkan untuk menggunakan setDefaultUncaughtExceptionHandler () untuk menangkap pengecualian tak terduga seperti itu di masa mendatang dan saya hanya menampilkan informasi terperinci kepada pengguna tentang izin yang dibutuhkan aplikasi Anda, bukan hanya mogok. Harap dicatat bahwa penggunaan ini kemungkinan besar akan bertentangan dengan alat seperti Crittercism, ACRA, dan lainnya, jadi berhati-hatilah jika Anda menggunakan ini.

Catatan

Harap sadari itu android.permission.INTERNET bukan satu-satunya izin terkait jaringan yang mungkin perlu Anda nyatakan dalam manifes sebagai upaya untuk berhasil melakukan jaringan. Memiliki INTERNET izin yang diberikan hanya memungkinkan aplikasi untuk membuka soket jaringan (yang pada dasarnya merupakan persyaratan mendasar untuk melakukan transfer data jaringan). Tetapi jika jaringan stack / library Anda ingin mendapatkan informasi tentang jaringan juga, maka Anda juga perlu android.permission.ACCESS_NETWORK_STATE di Manifes Anda (yang diperlukan oleh HttpUrlConnection klien (lihat tutorial).


Addendum (2015-07-16)

Harap dicatat bahwa Android 6 (alias Marshmallow) memperkenalkan mekanisme manajemen izin baru yang disebut Izin Runtime. Ini memberi pengguna kontrol lebih pada izin apa yang diberikan (juga memungkinkan hibah selektif) atau memungkinkan satu pencabutan izin yang sudah disetujui tanpa perlu penghapusan aplikasi:

Ini [...] memperkenalkan model izin baru, di mana pengguna dapat sekarang   langsung mengelola izin aplikasi saat waktu proses. Model ini memberi pengguna   meningkatkan visibilitas dan kontrol atas izin, sambil menyederhanakan   proses instalasi dan pembaruan otomatis untuk pengembang aplikasi. Pengguna   dapat memberikan atau mencabut izin satu per satu untuk aplikasi yang dipasang.

Namun, perubahan itu tidak mempengaruhi INTERNET atau ACCESS_NETWORK_STATE perizinan, yang dianggap sebagai izin "Normal". Pengguna tidak perlu secara eksplisit memberikan izin ini.

Lihat deskripsi perubahan perilaku halaman untuk rincian dan pastikan aplikasi Anda akan berperilaku dengan benar pada sistem yang lebih baru juga. Ini sangat penting ketika proyek Anda ditetapkan targetSdk setidaknya 23 seperti kamu harus mendukung model izin baru (dokumentasi rinci). Jika Anda belum siap, pastikan Anda menyimpannya targetSdk paling banyak 22 karena ini memastikan Android baru akan menggunakan sistem izin lama ketika aplikasi Anda diinstal.


107
2018-06-28 09:01



Android Studio 1.3b1 (tidak yakin tentang versi lain) secara otomatis melengkapi izin internet saya ANDROID.PERMISSION.INTERNET. Mengubahnya menjadi android.permission.INTERNET memperbaiki masalah.


33
2017-07-16 22:37



Tambahkan ke manifes file baris:

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

Itu memperbaikinya untuk saya.


26
2018-06-17 18:49



Pastikan tempat di mana Anda menambahkan

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

benar.

Anda harus menulisnya seperti itu di AndroidManifest.xml:

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

Jangan membuat kesalahan saya :)


26
2018-02-02 18:42



Saya menyelesaikan kesalahan ini, saya menambahkan izin di dalam tag Aplikasi karena kesalahan. Saya putted di luar dan itu berfungsi dengan baik. Semoga ini membantu untuk seseorang.


20
2018-05-10 19:39



Saya juga punya masalah ini. itu aneh bahwa itu bekerja pada emulator lolipop saya, tetapi tidak pada perangkat kitkat saya yang sebenarnya.

Android Studio sekarang akan memaksa Anda untuk menulis huruf besar izin, dan itulah masalahnya.

Menambahkan

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

Di atas tab aplikasi dan itu akan bekerja.


14
2017-07-07 13:45



Letakkan izin ini di luar <application> tag lebih baik sebelum tag, saya mencoba dan berfungsi untuk saya.

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

5
2017-12-19 00:50



Tulis izin Anda sebelum tag aplikasi seperti yang diberikan di bawah ini.

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

5
2017-10-18 17:41