Android 自API 28以来是否再次需要安卓.permission.INTERNET?

Android 自API 28以来是否再次需要安卓.permission.INTERNET?,android,admob,android-permissions,android-9.0-pie,Android,Admob,Android Permissions,Android 9.0 Pie,在尝试将admob和api级别更新为api 28后,我收到以下Lint警告: Missing permissions required by MobileAds.initialize: android.permission.INTERNET 调用这些函数时: MobileAds.initialize(context, context.getString(R.string.app_id)); mInterstitialAd.loadAd(new AdRequest.Builder().build

在尝试将admob和api级别更新为api 28后,我收到以下Lint警告:

Missing permissions required by MobileAds.initialize: android.permission.INTERNET
调用这些函数时:

MobileAds.initialize(context, context.getString(R.string.app_id));
mInterstitialAd.loadAd(new AdRequest.Builder().build());
这怎么可能

我记得很多年前就不需要android.permission.INTERNET了。应用程序可以在不使用该权限的情况下访问互联网。即使在这个应用程序中,我也有一些连接到Internet的连接,并且它们工作得很成功。我正在检索数据,它正在工作,甚至广告也在显示。所有这些都没有在舱单上声明的许可

为什么Lint会显示该警告?

android.permission.INTERNET需要在清单中声明,但其保护级别为,即不危险。普通权限不需要像危险权限那样请求访问用户,但需要声明。见增加的重点:

如果应用程序在其清单中声明它需要正常权限,则系统会在安装时自动授予该应用程序该权限。系统不会提示用户授予正常权限,用户无法撤消这些权限

android.permission.INTERNET需要在清单中声明,但其保护级别为,即不危险。普通权限不需要像危险权限那样请求访问用户,但需要声明。见增加的重点:

如果应用程序在其清单中声明它需要正常权限,则系统会在安装时自动授予该应用程序该权限。系统不会提示用户授予正常权限,用户无法撤消这些权限

从那时起,android.permission.INTERNET权限一直是必需的

但是有可能uses权限是由您包含的依赖项声明的,而现在它不再存在,这可能是因为您删除了该依赖项,或者更新版本的依赖项不再需要它。因此,现在您必须在清单中明确请求权限。

从那时起,就需要android.permission.INTERNET权限

但是有可能uses权限是由您包含的依赖项声明的,而现在它不再存在,这可能是因为您删除了该依赖项,或者更新版本的依赖项不再需要它。因此,现在您必须在清单中明确请求权限。

MobileAds.initialize用@requirepermissionandroid.permission.INTERNET注释

Lint是愚蠢的,它并不真正了解像INTERNET这样默认授予的权限。相反,它会分析您的代码,并看到您在未经权限检查的情况下调用此方法。您可以忽略此警告。

MobileAds.initialize用@requirepermissionandroid.permission.INTERNET注释

Lint是愚蠢的,它并不真正了解像INTERNET这样默认授予的权限。相反,它会分析您的代码,并看到您在未经权限检查的情况下调用此方法。您可以忽略此警告

应用程序可以在不使用该权限的情况下访问互联网

不,他们不是

该权限已经有很长一段时间没有呈现给用户了——甚至在Android 6.0自动授予所有正常权限之前,它就已经被自动授予了。但是,对于源自您的进程的网络I/O,它仍然是必需的权限

例如,我创建了一个带有协同程序的废弃Kotlin项目,并将MainActivity调整为:

未经互联网许可,我在以下情况下崩溃:

java.lang.SecurityException: Permission denied (missing INTERNET permission?)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:151)
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
    at java.net.InetAddress.getAllByName(InetAddress.java:1154)
    at com.android.okhttp.Dns$1.lookup(Dns.java:39)
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26)
    at com.commonsware.android.myapplication.MainActivity$doTheDownload$2.invokeSuspend(MainActivity.kt:35)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
 Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
    at libcore.io.Linux.android_getaddrinfo(Native Method)
    at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:172)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:137)
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1154) 
    at com.android.okhttp.Dns$1.lookup(Dns.java:39) 
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175) 
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141) 
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83) 
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174) 
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126) 
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244) 
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26) 
    at com.commonsware.android.myapplication.MainActivity$doTheDownload$2.invokeSuspend(MainActivity.kt:35) 
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742) 
 Caused by: android.system.ErrnoException: android_getaddrinfo failed: EACCES (Permission denied)
    at libcore.io.Linux.android_getaddrinfo(Native Method) 
    at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:172) 
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:137) 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1154) 
    at com.android.okhttp.Dns$1.lookup(Dns.java:39) 
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175) 
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141) 
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83) 
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174) 
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126) 
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244) 
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26) 
    at com.commonsware.android.myapplication.MainActivity$doTheDownload$2.invokeSuspend(MainActivity.kt:35) 
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742) 
在互联网许可的情况下,应用程序可以很好地下载内容。这两项测试都是在安卓9.0上进行的

所有这些都没有在舱单上声明的许可

也许你从图书馆得到了许可,但这并不能解释AdMob的困惑

应用程序可以在不使用该权限的情况下访问互联网

不,他们不是

该权限已经有很长一段时间没有呈现给用户了——甚至在Android 6.0自动授予所有正常权限之前,它就已经被自动授予了。但是,对于源自您的进程的网络I/O,它仍然是必需的权限

例如,我创建了一个带有协同程序的废弃Kotlin项目,并将MainActivity调整为:

未经互联网许可,我在以下情况下崩溃:

java.lang.SecurityException: Permission denied (missing INTERNET permission?)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:151)
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
    at java.net.InetAddress.getAllByName(InetAddress.java:1154)
    at com.android.okhttp.Dns$1.lookup(Dns.java:39)
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175)
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141)
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26)
    at com.commonsware.android.myapplication.MainActivity$doTheDownload$2.invokeSuspend(MainActivity.kt:35)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742)
 Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
    at libcore.io.Linux.android_getaddrinfo(Native Method)
    at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:172)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:137)
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1154) 
    at com.android.okhttp.Dns$1.lookup(Dns.java:39) 
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175) 
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141) 
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83) 
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174) 
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126) 
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244) 
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26) 
    at com.commonsware.android.myapplication.MainActivity$doTheDownload$2.invokeSuspend(MainActivity.kt:35) 
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742) 
 Caused by: android.system.ErrnoException: android_getaddrinfo failed: EACCES (Permission denied)
    at libcore.io.Linux.android_getaddrinfo(Native Method) 
    at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:172) 
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:137) 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1154) 
    at com.android.okhttp.Dns$1.lookup(Dns.java:39) 
    at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:175) 
    at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:141) 
    at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:83) 
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:174) 
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126) 
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95) 
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281) 
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407) 
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:244) 
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:26) 
    at com.commonsware.android.myapplication.MainActivity$doTheDownload$2.invokeSuspend(MainActivity.kt:35) 
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) 
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742) 
在互联网许可的情况下,应用程序可以很好地下载内容。这两项测试都是在安卓9.0上进行的

所有这些都没有在舱单上声明的许可


也许你是从图书馆获得了许可,但这并不能解释AdMob的困惑。

我不知道有任何文件表明不需要互联网许可。。如果您正在访问INTERNET,则必须在清单中包含android.permission.INTERNET。。如果你有一些文件表明这一点,那么在这里广告。如果你没有这个权限,并能够使用互联网,这可能是因为一些l
您的项目中的库已经有了它,并且由于它不是运行时权限,它将自动被允许..我不知道有任何文档表明不需要Internet权限。。如果您正在访问INTERNET,则必须在清单中包含android.permission.INTERNET。。如果您有一些文档表明了这一点,那么将其添加到此处。如果您没有此权限并且无法使用internet,这可能是因为您项目中的某些库已经具有此权限,并且由于它不是运行时权限,因此将自动允许。为了验证权限来自何处,您可以在编辑时选择“合并清单”选项卡您的应用程序清单。为了验证权限来自何处,您可以在编辑应用程序清单时选择“合并清单”选项卡。