我尝试在 Android 中使用 HttpURLConnection
访问 HTTP 链接以下载文件,但在 LogCat
中收到此警告:
WARN/System.err(223): java.net.SocketException: Permission denied (maybe missing INTERNET permission)
我已将 android.Manifest.permission
添加到我的应用程序中,但它仍然给出相同的异常。
import android.Manifest.permission
会为您做什么
假设您没有从您的 LogCat
错误描述中设置权限,这里是我的 AndroidManifest.xml
可以访问 Internet 的文件的内容:
<manifest xlmns:android...>
...
<uses-permission android:name="android.permission.INTERNET" />
<application ...
</manifest>
除此之外,您应该可以从 Internet 下载文件。
权限名称区分大小写
万一有人遇到同样的问题,这是区分大小写的声明,所以错误的大小写意味着您的应用程序不会获得许可。
错误的
<uses-permission android:name="ANDROID.PERMISSION.INTERNET" />
正确的
<uses-permission android:name="android.permission.INTERNET" />
这个问题可能会发生,即。关于 IDE 中的自动完成
ANDROID.PERMISSION
和 android.permission
;) :p
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.photoeffect"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.example.towntour.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar" >
<activity
android:name="com.photoeffect.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
如果您使用 Eclipse ADT 插件进行开发,请在 Android 清单编辑器中打开 AndroidManifest.xml
(应该是从项目文件列表中打开 AndroidManifest.xml
的默认操作)。
然后,选择编辑器底部的 Permissions
标签 (Manifest - Application - Permissions - Instrumentation - AndroidManifest.xml
),然后点击 Add...
a Uses Permission
并从右侧的下拉列表中选择所需的权限,或者只需复制粘贴到必要的权限(例如您需要的 android.permission.INTERNET
权限)。
将以下行复制到您的应用程序清单文件并粘贴到 <application>
标记之前。
<uses-permission android:name="android.permission.INTERNET"/>
将权限放在 <application/>
标记下方会起作用,但会给您警告。因此,请注意将其放在 <application/>
标记声明之前。
使用 eclipse 时,请按照以下步骤操作
双击清单以在编辑器上显示它单击清单编辑器下方的权限选项卡单击出现的对话框上的添加按钮单击使用权限。 (通常是列表的最后一项)注意出现在rigth侧的视图选择“android.permission.INTERNET”然后一系列Ok最后保存。
希望这可以帮助
在您的应用程序标签中添加以下行:
android:usesCleartextTraffic="true"
看起来像下面的代码:
<application
....
android:usesCleartextTraffic="true"
....>
并在application
的上方添加以下标签
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
变成那样:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.themarona.app">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我迟到了,但我想完成答案。
在 manifest.xml
中添加了一个权限,例如
<uses-permission android:name="android.permission.INTERNET"/>
对于没有向用户提示权限的 standard permissions,这已经足够了。但是,如果它是一个危险的权限,仅仅添加权限是不够的。见android doc。像相机,存储权限。
<uses-permission android:name="android.permission.CAMERA"/>
您需要ask permission from user。我使用广泛使用的库 RxPermission 来请求许可。因为它是我们必须编写的长代码来请求许可。
RxPermissions rxPermissions = new RxPermissions(this); // where this is an Activity instance // Must be done during an initialization phase like onCreate
rxPermissions
.request(Manifest.permission.CAMERA)
.subscribe(granted -> {
if (granted) { // Always true pre-M
// I can control the camera now
} else {
// Oups permission denied
}
});
将此库添加到您的应用程序
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.tbruyelle:rxpermissions:0.10.1'
implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
}
在将 INTERNET 权限添加到您的应用程序的上下文中,这可能也很有趣:
谷歌还为每个应用授予了互联网访问权限,有效地取消了互联网访问权限。哦,当然,Android 开发人员在组装应用程序时仍然必须声明他们想要访问 Internet。但是用户在安装应用程序时不再可以看到 Internet 访问权限,并且当前无法访问 Internet 的应用程序现在可以通过自动更新获得 Internet 访问权限,而无需提示您。
底线是您仍然必须在清单文件中添加 INTERNET 权限,但应用程序将在用户的设备上更新,而无需询问他们新的权限。
对于颤振开发者。
去
android/app/main/AndroidManifest.xml
外面
应用程序标签
但在里面
清单标签
添加
<uses-permission android:name="android.permission.INTERNET" />
当您尝试通过 android 模拟器加载或访问互联网时,您必须在清单文件中同时使用网络和访问网络状态。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
如果您只授予 .INTERNET 权限,它将无法访问互联网。
如果您使用的是 Android Studio,请将鼠标悬停在需要权限的代码上,然后单击“添加权限..”
https://i.stack.imgur.com/0A5vk.png
然后你可以用 git 检查 AndroidManifest.xml 中的变化。
application
标记内没有uses-permission
的子元素,只有manifest
。