ten błąd jest naprawdę bardzo dziwny i nie wiem, jak go odtworzyć i jak to naprawić, ponieważ przeprowadziłem wiele wyszukiwań, ale nic nie było przydatne.
Oto ślad stosu:
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)
Oto mój plik 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>
Nie kłopocz się pytaniem mnie, czy w moim manifeście mam prawidłowe pozwolenie INTERNETOWE, ponieważ ta aplikacja jest na rynku od 2 lat: P
Zauważyłem również, że (z Crittercism) wszystkie błędy pochodzą z wersji Androida 4.1.x (JB). Nie wiem, czy urządzenie jest zrootowane, czy co (na razie nie widzę tych informacji)
Odpowiedzi:
UWAGA: napisałem tę odpowiedź w czerwcu 2013 roku, więc obecnie jest nieco przestarzała. Wiele rzeczy zmieniło się na platformie Android od wersji 6 (Marshmallow), sprawiając, że cały problem jest obecnie mniej / bardziej przestarzały. Uważam jednak, że nadal warto przeczytać ten post jako przykład ogólnego podejścia do analizy problemu.
Wyjątek, który otrzymujesz (
SecurityException: Permission denied (missing INTERNET permission?)
), wyraźnie wskazuje, że nie możesz korzystać z sieci. To całkiem niepodważalny fakt. Ale jak to się może stać? Zwykle jest to spowodowane brakującym<uses-permission android:name="android.permission.INTERNET" />
wpisem w TwoimAndroidManifest.xml
pliku lub, ponieważ zezwolenie na Internet jest udzielane podczas instalacji, a nie w czasie wykonywania, przez długi, brakujący błąd w strukturze Androida, który powoduje pomyślne zainstalowanie aplikacji, ale bez oczekiwanego pozwolenia.Mój Manifest jest poprawny, więc jak to się może stać?
Teoretycznie obecność
uses-permission
w Manifest doskonale spełnia wymagania iz punktu widzenia programisty to wszystko, co trzeba zrobić, aby móc tworzyć sieci. Ponadto, ponieważ uprawnienia są wyświetlane użytkownikowi podczas instalacji, fakt, że Twoja aplikacja została zainstalowana na urządzeniu użytkownika, oznacza, że przyznał on to, o co prosiłeś (w przeciwnym razie instalacja zostanie anulowana), więc załóżmy, że jeśli twój kod zostanie wykonany, wszystkie żądane uprawnienia są przyznane jest ważne. Po przyznaniu, użytkownik nie może cofnąć pozwolenia w inny sposób niż całkowite odinstalowanie aplikacji, ponieważ standardowa platforma Android (od AOSP) nie oferuje obecnie takiej funkcji.Ale sprawy stają się trudniejsze, jeśli nie masz nic przeciwko, aby aplikacja działała również na zrootowanych urządzeniach. W Google Play są dostępne narzędzia, które użytkownicy mogą zainstalować, aby kontrolować uprawnienia przyznane zainstalowanym aplikacjom w czasie wykonywania - na przykład: Odmowa uprawnień i inne. Można to również zrobić za pomocą CyanogenMod , marki producenta (np. LG) lub innej niestandardowej pamięci ROM , zawierającej różnego rodzaju „menedżerów prywatności” lub podobne narzędzia.
Więc jeśli aplikacja jest zablokowana w dowolny sposób, jest zasadniczo blokowana celowo przez użytkownika, a jeśli tak, w tym przypadku jest to naprawdę większy problem użytkownika (lub nie rozumie, co naprawdę robią niektóre opcje / narzędzia i jakie byłyby konsekwencje) niż twój, ponieważ standardowy SDK (i większość aplikacji jest napisanych z myślą o tym SDK) po prostu nie zachowuje się w ten sposób. Więc mocno wątpię, że ten problem występuje na "standardowym", nierootowanym urządzeniu z zapasowym (lub dostawcą takim jak Samsung, HTC, Sony itp.) ROM.
Nie chcę się rozbić ...
Prawidłowo zaimplementowane zarządzanie uprawnieniami i / lub blokowanie organizacji muszą uwzględniać fakt, że większość aplikacji może nie być gotowa na sytuację, w której dostęp do niektórych funkcji jest zarówno przyznany, jak i niedostępny w tym samym czasie, ponieważ jest to rodzaj sprzeczności, gdy aplikacja używa manifestu do poproś o dostęp w czasie instalacji. Właściwa kontrola dostępu powinna sprawić, że wszystko będzie działać jak poprzednio, a jednocześnie ograniczać użyteczność przy użyciu technik w zakresie oczekiwanego zachowania funkcji. Na przykład, gdy przyznane zostanie określone pozwolenie (np. GPS, dostęp do Internetu) taka funkcja może zostać udostępniona z perspektywy aplikacji / użytkownika (tj. Można włączyć GPS. Lub spróbować się połączyć), zmieniona implementacja nie może dostarczyć żadnych rzeczywistych danych - tzn. GPS zawsze może nie zwrócić żadnych współrzędnych, na przykład gdy jesteś w pomieszczeniu lub nie masz połączenia satelitarnego. Dostęp do Internetu można przyznać jak poprzednio, ale nie możesz nawiązać udanego połączenia, ponieważ nie ma zasięgu ani routingu danych. Takich scenariuszy należy się spodziewać również przy normalnym użytkowaniu, dlatego powinny być już obsługiwane przez aplikacje. Ponieważ może się to po prostu zdarzyć podczas normalnego codziennego użytkowania, każda awaria w takiej sytuacji powinna być najprawdopodobniej związana z błędami aplikacji.
Brakuje nam zbyt wielu informacji o środowisku, w którym występuje ten problem, aby zdiagnozować problem bez zgadywania, ale jako rodzaj rozwiązania możesz rozważyć użycie setDefaultUncaughtExceptionHandler () do wychwytywania takich nieoczekiwanych wyjątków w przyszłości, czyli po prostu pokazać użytkownikowi szczegółowe informacje o uprawnieniach Twoja aplikacja potrzebuje zamiast po prostu awarii. Pamiętaj, że używanie tego najprawdopodobniej będzie kolidować z narzędziami takimi jak Crittercism, ACRA i innymi, więc zachowaj ostrożność, jeśli używasz któregokolwiek z nich.
Uwagi
Należy pamiętać, że
android.permission.INTERNET
nie jest to jedyne uprawnienie związane z siecią, które może być konieczne do zadeklarowania w manifeście w celu pomyślnego nawiązania połączenia. MającINTERNET
uprawnienia przyznanego po prostu umożliwia aplikacjom gniazd otwartej sieci (co jest w zasadzie podstawowym wymogiem, aby zrobić każdą transmisję danych). Ale w przypadku, gdy twój stos / biblioteka sieciowa chciałby również uzyskać informacje o sieciach, będziesz również potrzebowałandroid.permission.ACCESS_NETWORK_STATE
swojego Manifestu (który jest wymagany przez klienta HttpUrlConnection ( patrz tutorial ).Dodatek (16.07.2015)
Należy pamiętać, że Android 6 (znany również jako Marshmallow) wprowadził zupełnie nowy mechanizm zarządzania uprawnieniami o nazwie Uprawnienia wykonawcze . Daje użytkownikowi większą kontrolę nad tym, jakie uprawnienia są przyznawane (umożliwia także selektywne przyznawanie) lub pozwala cofnąć już przyznane uprawnienia bez konieczności usuwania aplikacji:
Jednak zmiany nie mają wpływu na uprawnienia
INTERNET
aniACCESS_NETWORK_STATE
uprawnienia, które są uważane za uprawnienia „normalne”. Użytkownik nie musi jawnie udzielać tych uprawnień.Szczegółowe informacje można znaleźć na stronie opisu zmian zachowania i upewnić się, że aplikacja będzie działać poprawnie również w nowszych systemach. Jest to szczególnie ważne, gdy projekt jest ustawiony
targetSdk
na co najmniej23
tak, jak wtedy musisz obsługiwać nowy model uprawnień ( szczegółowa dokumentacja ). Jeśli nie jesteś gotowy, upewnij się, że trzymasztargetSdk
się co najwyżej,22
ponieważ zapewnia to, że nawet nowy Android użyje starego systemu uprawnień po zainstalowaniu aplikacji.źródło
Upewnij się, że miejsce, w którym dodajesz
<uses-permission android:name="android.permission.INTERNET"/>
jest w porządku.
Powinieneś napisać to tak w AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.project"> <uses-permission android:name="android.permission.INTERNET"/>
Nie rób moich błędów :)
źródło
Android Studio 1.3b1 (nie jestem pewien co do innych wersji) automatycznie uzupełnił moje uprawnienia internetowe do
ANDROID.PERMISSION.INTERNET
. Zmiana w celuandroid.permission.INTERNET
rozwiązania problemu.źródło
Dodaj do pliku manifestu wiersz:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Naprawiło to dla mnie.
źródło
Rozwiązałem ten błąd, przez pomyłkę dodawałem uprawnienia w tagu aplikacji. Postawiłem na zewnątrz i działa dobrze. Mam nadzieję, że to pomoże komuś.
źródło
Ja też miałem ten problem. to było dziwne, że działał na moim emulatorze Lollipopa, ale nie na moim rzeczywistym urządzeniu KitKat.
Android Studio zmusi Cię teraz do wpisania wielkich liter uprawnień i to jest problem.
Dodaj
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Powyżej zakładki aplikacji i będzie działać.
źródło
Napisz swoją zgodę przed tagiem aplikacji, jak podano poniżej.
<?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">
źródło
Umieść te uprawnienia poza
<application>
tagiem, najlepiej przed tagiem, wypróbowałem i działa dla mnie.<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
źródło
jeśli to był adres IPv6, spójrz na to: https://code.google.com/p/android/issues/detail?id=33046
Wygląda na to, że w Androidzie był błąd, który został naprawiony w wersji 4.3 (?).
źródło
Tak jak wspomniał Tom. Kiedy zaczniesz od kapitału,
A
autouzupełnianie zakończy je jako.ANDROID.PERMISSION.INTERNET
Kiedy zaczniesz pisać,
a
autouzupełnianie zakończy je jakoandroid.permission.INTERNET
Drugi jest właściwy.
źródło
Spędzam godziny szukając rozwiązania tego problemu i żadne z odpowiedzi nie zadziałało. Potem dowiedziałem się, że przypadkowo dodałem spację podczas autouzupełniania między
android.permission.INTERNET
a"
źródło
Cóż, to bardzo zagmatwany rodzaj błędu. Powodów może być wiele:
źródło
usuń to z pliku manifestu
xmlns:tools="http://schemas.android.com/tools"
źródło