kesalahan ini benar-benar sangat aneh dan saya tidak tahu bagaimana mereproduksinya dan bagaimana memperbaikinya karena saya melakukan 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 di manifes saya karena aplikasi ini ada di pasar sejak 2 tahun: P.
Saya juga memperhatikan bahwa (dari Crittercism) semua bug berasal dari versi Android 4.1.x (JB). Saya tidak tahu apakah perangkat di-root atau apa (saya tidak dapat melihat informasi ini untuk saat ini)
Jawaban:
CATATAN: Saya menulis jawaban ini pada Juni 2013, jadi agak ketinggalan zaman sekarang. Banyak hal yang berubah di platform Android sejak versi 6 (Marshmallow), membuat keseluruhan masalah menjadi lebih / kurang usang saat ini. Namun saya yakin posting ini masih bisa dibaca sebagai contoh pendekatan analisis masalah umum.
Pengecualian Anda mendapatkan (
SecurityException: Permission denied (missing INTERNET permission?)
), dengan jelas menunjukkan bahwa Anda tidak diperbolehkan untuk melakukan jaringan. Itu fakta yang tak terbantahkan. Tapi bagaimana ini bisa terjadi? Biasanya itu baik karena<uses-permission android:name="android.permission.INTERNET" />
entri yang hilang dalamAndroidManifest.xml
file Anda atau, karena izin internet diberikan saat penginstalan bukan pada waktu proses, karena bug yang terlewat dalam kerangka Android yang sudah lama ada dalam kerangka kerja Android yang menyebabkan aplikasi Anda berhasil diinstal, tetapi tanpa izin yang diharapkan.Manifes saya benar, jadi bagaimana ini bisa terjadi?
Secara teoritis, kehadiran
uses-permission
di Manifest secara sempurna memenuhi kebutuhan dan dari sudut pandang pengembang adalah semua yang perlu dilakukan untuk dapat melakukan jaringan. Selain itu, karena izin ditampilkan kepada pengguna selama penginstalan, fakta bahwa aplikasi Anda berakhir diinstal di perangkat pengguna berarti ia telah memberikan apa yang Anda minta (jika tidak penginstalan dibatalkan), jadi anggaplah bahwa jika kode Anda dijalankan maka semua izin yang diminta adalah diberikan adalah valid. Dan begitu diberikan, pengguna tidak dapat mencabut izin dengan cara lain selain mencopot pemasangan aplikasi sepenuhnya karena kerangka kerja Android standar (dari AOSP) tidak menawarkan fitur seperti itu saat ini.Tetapi hal-hal menjadi lebih rumit jika Anda juga tidak keberatan aplikasi Anda berjalan pada perangkat yang di- root juga. Ada alat yang tersedia di Google Play yang dapat dipasang oleh pengguna Anda untuk mengontrol izin yang diberikan ke aplikasi yang dipasang pada saat berjalan - misalnya: Izin Ditolak dan lainnya. Ini juga dapat dilakukan dengan CyanogenMod , merek vendor (yaitu LG) atau ROM khusus lainnya , yang menampilkan berbagai jenis "pengelola privasi" atau alat serupa.
Jadi jika aplikasi diblokir dengan cara apa pun, itu pada dasarnya diblokir dengan sengaja oleh pengguna dan jika demikian, itu benar-benar lebih banyak masalah pengguna dalam kasus ini (atau dia tidak mengerti apa yang sebenarnya dilakukan opsi / alat tertentu dan apa konsekuensinya) daripada milik Anda, karena SDK standar (dan sebagian besar aplikasi dibuat dengan mempertimbangkan SDK tersebut) tidak berperilaku seperti itu. Jadi saya sangat meragukan masalah ini terjadi pada "standar", perangkat yang tidak di-rooting dengan stok (atau vendor seperti Samsung, HTC, Sony dll) ROM.
Saya tidak ingin jatuh ...
Manajemen izin yang diterapkan dengan benar dan pemblokiran / org harus berurusan dengan fakta 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 berfungsi seperti sebelumnya, dan tetap membatasi kegunaan menggunakan teknik dalam lingkup perilaku yang diharapkan dari fitur tersebut. Misalnya, ketika izin tertentu diberikan (misalnya GPS, akses Internet), fitur tersebut dapat tersedia dari aplikasi / perspektif pengguna (yaitu Anda dapat mengaktifkan GPS. Atau mencoba menghubungkan), implementasi yang diubah tidak dapat memberikan data nyata - yaitu GPS selalu tidak dapat mengembalikan koordinat, seperti saat Anda berada di dalam ruangan atau tidak memiliki satelit "fix". Akses internet dapat diberikan seperti sebelumnya, tetapi Anda tidak dapat membuat sambungan yang berhasil karena tidak ada jangkauan data atau perutean. Skenario seperti itu seharusnya diharapkan dalam penggunaan normal juga, oleh karena itu harus sudah ditangani oleh aplikasi. Karena ini hanya dapat terjadi selama penggunaan normal setiap hari, setiap kerusakan dalam situasi seperti itu kemungkinan besar terkait dengan bug aplikasi.
Kami kekurangan terlalu banyak informasi tentang lingkungan tempat masalah ini terjadi untuk mendiagnosis masalah tanpa menebak-nebak, tetapi sebagai jenis solusi, Anda dapat mempertimbangkan menggunakan setDefaultUncaughtExceptionHandler () untuk menangkap pengecualian tak terduga seperti itu di masa mendatang dan yaitu hanya menunjukkan informasi mendetail kepada pengguna izin apa kebutuhan aplikasi Anda, bukan hanya mogok. Harap dicatat bahwa menggunakan ini kemungkinan besar akan konflik dengan alat seperti Crittercism, ACRA dan lainnya, jadi berhati-hatilah jika Anda menggunakan salah satu dari ini.
Catatan
Perlu diketahui bahwa
android.permission.INTERNET
bukan satu-satunya izin terkait jaringan yang mungkin perlu Anda deklarasikan dalam manifes agar berhasil melakukan jaringan. MemilikiINTERNET
izin yang diberikan hanya memungkinkan aplikasi untuk soket jaringan terbuka (yang pada dasarnya merupakan kebutuhan mendasar untuk melakukan transfer data jaringan). Tetapi jika jaringan / pustaka Anda ingin mendapatkan informasi tentang jaringan juga, maka Anda juga akan membutuhkannyaandroid.permission.ACCESS_NETWORK_STATE
dalam Manifes Anda (yang dibutuhkan oleh klien HttpUrlConnection ( lihat tutorial ).Addendum (2015-07-16)
Harap dicatat bahwa Android 6 (alias Marshmallow) memperkenalkan mekanisme manajemen izin yang benar-benar baru yang disebut Izin Waktu Proses . Ini memberi pengguna lebih banyak kontrol tentang izin apa yang diberikan (juga memungkinkan pemberian selektif) atau memungkinkan seseorang mencabut izin yang sudah diberikan tanpa perlu penghapusan aplikasi:
Namun, perubahan tidak mempengaruhi
INTERNET
atauACCESS_NETWORK_STATE
izin, yang dianggap izin "Normal". Pengguna tidak perlu memberikan izin ini secara eksplisit.Lihat halaman deskripsi perubahan perilaku untuk mengetahui detailnya dan pastikan aplikasi Anda juga akan berfungsi dengan benar di sistem yang lebih baru. Ini sangat penting ketika proyek Anda disetel
targetSdk
ke setidaknya23
seperti itu Anda harus mendukung model izin baru ( dokumentasi terperinci ). Jika Anda tidak siap, pastikan Anda tetaptargetSdk
untuk paling22
sebagai Memastikan ini bahkan Android baru akan menggunakan sistem izin tua ketika aplikasi diinstal.sumber
Pastikan bahwa tempat Anda menambahkan
<uses-permission android:name="android.permission.INTERNET"/>
benar.
Anda harus menuliskannya 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 :)
sumber
Android Studio 1.3b1 (tidak yakin tentang versi lain) otomatis melengkapi izin internet saya
ANDROID.PERMISSION.INTERNET
. Mengubahnya untukandroid.permission.INTERNET
memperbaiki masalah.sumber
Tambahkan ke file manifes baris:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Itu memperbaikinya untuk saya.
sumber
Saya menyelesaikan kesalahan ini, saya tidak sengaja menambahkan izin di dalam tag Aplikasi. Saya meletakkan di luar dan itu berfungsi dengan baik. Semoga bisa membantu seseorang.
sumber
Saya juga punya masalah ini. aneh rasanya itu berfungsi pada emulator lollipop saya, tetapi tidak pada perangkat kitkat saya yang sebenarnya.
Android Studio sekarang akan memaksa Anda untuk menulis izin huruf besar, 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 berfungsi.
sumber
Tuliskan 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">
sumber
Letakkan izin ini di luar
<application>
tag lebih disukai sebelum tag, saya mencobanya dan itu berhasil untuk saya.<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
sumber
jika itu adalah alamat IPv6, lihat ini: https://code.google.com/p/android/issues/detail?id=33046
Sepertinya ada bug di Android yang diperbaiki di 4.3 (?).
sumber
Seperti yang disebutkan Tom. Saat Anda memulai dengan modal,
A
pelengkapan otomatis akan menyelesaikannya sebagai.ANDROID.PERMISSION.INTERNET
Saat Anda mulai mengetik dengan
a
maka pelengkapan otomatis akan menyelesaikannya sebagaiandroid.permission.INTERNET
Yang kedua adalah yang benar.
sumber
Saya menghabiskan waktu berjam-jam mencari solusi untuk masalah ini dan tidak ada solusi dalam jawaban yang berhasil. Kemudian saya menemukan bahwa saya tidak sengaja menambahkan spasi selama pelengkapan otomatis antara
android.permission.INTERNET
dan"
sumber
Ini adalah jenis bug yang sangat membingungkan. Mungkin ada banyak alasan:
sumber
hapus ini di file manifes Anda
xmlns:tools="http://schemas.android.com/tools"
sumber