如何为应用程序添加清单权限?

565

我正在尝试使用Android中的HttpURLConnection访问HTTP链接以下载文件,但是在LogCat中出现了以下警告:

WARN/System.err(223): java.net.SocketException: Permission denied (maybe missing INTERNET permission)

我已将android.Manifest.permission添加到我的应用程序中,但仍然出现相同的异常。


请粘贴您的清单权限内容,您是否授予了INTERNET权限? - Anthony Forloney
1
我在应用程序中添加了import android.Manifest.permission;,除此之外还需要添加什么来授予权限? - rob
2
请看下面的答案,看看是否有帮助。如果您在AndroidManifest.xml文件中没有设置INTERNET权限,我不知道import android.Manifest.permission会对您有什么帮助。 - Anthony Forloney
13个回答

1230

假设您没有从LogCat错误描述中设置权限,这是我AndroidManifest.xml文件的内容,其中具有访问互联网的权限:

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

除此以外,你可以放心地从互联网下载文件。


4
如果你找到了解决你问题或似乎有帮助的答案,将其选择为“已回答”并/或点赞是很有用的,这可以帮助社区中遇到相同问题的任何人。这不仅适用于这个问题,也适用于你提出的其他问题。 - Anthony Forloney
1
在我的情况下,我必须确保它是清单语句之后的第一行...如果在那之下任何地方,它都不会起作用。v2.2,API级别8,HTC G1。 - slf
权限名称区分大小写吗? - Jaime Hablutzel
在将<uses-permission>插入到manifestapplication中,有什么区别吗? - dialex
1
据我所知,在“应用程序”标签内没有“uses-permission”的子元素,只有“清单”。 - Anthony Forloney
显示剩余3条评论

106

权限名称区分大小写

如果有人遇到同样的问题,它是区分大小写的,因此错误的大小写会导致您的应用程序无法获取权限。

错误示例

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

正确

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

这个问题可能会在IDE的自动完成中出现。


1
谢谢!我浪费了一整天的时间想知道为什么我的应用程序不工作。我是Android Studio的新手,在Eclipse中从未出现过这个问题 :) - InspiredCoder
3
我浪费了一整天的时间来弄清它们之间的实际区别,哦天啊,原来是大小写的问题:ANDROID.PERMISSIONandroid.permission ;) :p - fWd82
2
文档:https://developer.android.com/training/basics/network-ops/connecting.html - quant

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

34
如果您正在使用Eclipse ADT插件进行开发,请在Android Manifest Editor中打开AndroidManifest.xml(应该是从项目文件列表中打开AndroidManifest.xml的默认操作)。
随后,选择编辑器底部的Permissions选项卡(Manifest - Application - Permissions - Instrumentation - AndroidManifest.xml),然后单击Add...添加一个Uses Permission,从右侧下拉菜单中选择所需的权限,或者只需复制粘贴必要的权限(例如,您需要的android.permission.INTERNET权限)。

25
将以下行复制到您的应用程序清单文件中,并在<application>标签之前粘贴。
<uses-permission android:name="android.permission.INTERNET"/>

将权限放置在<application/>标签下面也可以工作,但是会给您一个警告。因此,请注意将其放置在<application/>标签声明之前。


1
写这条评论时,它处于应用元素之外但位于清单内。例如:<application> ... </application> <uses-permission android:name=" android.permission.INTERNET" /></manifest> - Steve Swinsburg

22

针对Flutter开发者。

前往

android/app/main/AndroidManifest.xml

manifest标签里

的外部但是在

application标签里

添加

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


14
在你的应用程序标签中添加以下行:

将以下行添加到应用程序标记中:

 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>

12

在使用Eclipse时,请按照以下步骤操作:

  1. 双击清单文件以在编辑器中显示
  2. 点击清单编辑器下方的“权限”选项卡
  3. 点击“添加”按钮
  4. 在弹出的对话框中,点击“使用权限”(通常是列表中的最后一个项目)
  5. 注意右侧显示的视图,选择“android.permission.INTERNET”
  6. 然后连续点击“确定”,最后保存。

希望这可以帮到您。


8

虽然我来晚了,但我想完成这个回答。

manifest.xml中添加了一个权限,例如:

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

这对于不需要提示用户的常规权限已足够。但是,如果是危险权限,则仅将权限添加到清单中还不足以满足要求。请参阅安卓文档,例如相机、存储权限等。请点击此处查看标准权限和此处查看安卓文档。
<uses-permission android:name="android.permission.CAMERA"/>

您需要向用户请求权限。 我使用了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'
}

4
这也许与在应用程序中添加INTERNET权限有关:
Google已经为每个应用程序提供了Internet访问,有效地取消了Internet访问权限。当然,Android开发人员在组合应用程序时仍然需要声明他们想要的Internet访问权限。但用户安装应用程序时不再能看到Internet访问权限,而且目前没有Internet访问权限的应用程序现在可以通过自动更新获得Internet访问,而无需提示您。
来源:http://www.howtogeek.com/190863/androids-app-permissions-were-just-simplified-now-theyre-much-less-secure/ 底线是,您仍然需要在清单文件中添加INTERNET权限,但应用程序会在用户设备上进行更新,而不需要询问他们是否需要新权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接