2016-06-22 100 views
0

我想在我的应用程序中提供一个功能,我需要权限INTERNETandroid:运行时请求权限

但是,并非所有用户都可能想要使用此功能,并且由于这是一个非常强大的许可,我不想强​​制每个人都将它提供给应用程序,如果他们想要使用它,仅当他们想要使用它时这个功能。

所以我必须在运行时询问该权限。该应用程序的最小sdk是15,我不想将其设置得更高。

方法requestPermissions(String[],int),我可以调用我的Activity仅适用于API 23,但我可以调用ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.INTERNET},0);,但它不会显示任何对话框。

是的,如果许可已经授予我已经检查:

if(ContextCompat.checkSelfPermission(this,Manifest.permission.INTERNET)!= 
PackageManager.PERMISSION_GRANTED) 
    ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.INTERNET},0); 

我在做什么错?

+0

参考[this](http://stackoverflow.com/a/36260089/5733111) – Sanoop

+0

如果我将其添加到清单,Android 6.0以下的所有用户必须在安装应用程序之前授予该权限... – Ginso

回答

5

android.permission.INTERNET执行自动授予执行权限,因此不需要请求它。

以下是自动授予权限列表。这些权限将在安装时自动授予,并且无法撤销。

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 
android.permission.ACCESS_NETWORK_STATE 
android.permission.ACCESS_NOTIFICATION_POLICY 
android.permission.ACCESS_WIFI_STATE 
android.permission.ACCESS_WIMAX_STATE 
android.permission.BLUETOOTH 
android.permission.BLUETOOTH_ADMIN 
android.permission.BROADCAST_STICKY 
android.permission.CHANGE_NETWORK_STATE 
android.permission.CHANGE_WIFI_MULTICAST_STATE 
android.permission.CHANGE_WIFI_STATE 
android.permission.CHANGE_WIMAX_STATE 
android.permission.DISABLE_KEYGUARD 
android.permission.EXPAND_STATUS_BAR 
android.permission.FLASHLIGHT 
android.permission.GET_ACCOUNTS 
android.permission.GET_PACKAGE_SIZE 
android.permission.INTERNET 
android.permission.KILL_BACKGROUND_PROCESSES 
android.permission.MODIFY_AUDIO_SETTINGS 
android.permission.NFC 
android.permission.READ_SYNC_SETTINGS 
android.permission.READ_SYNC_STATS 
android.permission.RECEIVE_BOOT_COMPLETED 
android.permission.REORDER_TASKS 
android.permission.REQUEST_INSTALL_PACKAGES 
android.permission.SET_TIME_ZONE 
android.permission.SET_WALLPAPER 
android.permission.SET_WALLPAPER_HINTS 
android.permission.SUBSCRIBED_FEEDS_READ 
android.permission.TRANSMIT_IR 
android.permission.USE_FINGERPRINT 
android.permission.VIBRATE 
android.permission.WAKE_LOCK 
android.permission.WRITE_SYNC_SETTINGS 
com.android.alarm.permission.SET_ALARM 
com.android.launcher.permission.INSTALL_SHORTCUT 
com.android.launcher.permission.UNINSTALL_SHORTCUT 

参考this更多

+0

If应用程序的targetSdkVersion设置为23+。 – David

+0

为什么我的if-test不会失败呢? – Ginso

+0

如果您的测试不会失败,因为已经授予此权限.... – Opiatefuchs

0

你设置什么targetSDKVersion?您必须将其设置为23,否则权限策略将来自较早的平台。

+0

在旧版平台中不可行吗?毕竟,这种方法早在API 23之前引入了 – Ginso

+0

在23以下的所有平台上,您都需要在安装时获得许可,并且您只需将其注册到清单中。谷歌改变了这种行为,你可以通过显示对话框并询问如果你想允许网络连接。您可以通过设置targetSdk低于23来保留旧的行为(在安装时询问),或者使用新的设置(将其设置为23(或更高)),但在较早的平台上,权限在安装时仍会询问。 –

1

android.permission.INTERNET权限是一个正常的权限。所以它会自动授予,无需任何对话。查看更多详情here

+0

但我不开发API 23 – Ginso

+0

我想你误解了ActivityCompat.requestPermissions的目的。它不会在运行时设置权限,但只会请求授予已在清单中添加的危险权限。 – manao

+0

请求安装应用程序时用户必须提供的权限的要点是什么?如果你阅读我的文章,你知道我想在运行时请求它,而不是仅仅设置它 – Ginso