我已在清单文件中添加了所有权限。在Lollipop中,所有应用程序都会在安装应用程序期间询问权限,但当应用程序安装在Marshmallow中时,权限不是询问。
清单权限是
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- My Location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
首先,您需要对所有这些权限进行分类。在Android M版本上,它们主要分为正常权限(如清单文件中的ACCESS\u NETWORK\u STATE)和危险权限(如ACCESS\u FINE\u LOCATION)。对于普通的,您不必再请求它们,它们将在安装时自动授予,而无需用户提醒。您只需将它们添加到清单中即可!
但是,危险的权限处理起来比较复杂。在应用程序启动或运行到相应的功能时,您必须首先检查权限是否已被Context.checkSelfPersion(String权限)
获取。调用Context.request权限(String[]权限,int Request estCode)
通过系统对话框请求并获取结果onRequest estPermissionsResult()
。
好消息是,当应用程序启动时,您可以通过一个API请求一系列权限。此外,危险权限在多个组中进行管理。例如,您只需要请求ACCESS\u FINE\u LOCATION和获取ACCESS\u Rough\u LOCATION权限。
首先声明:
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
请求所需的权限:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
处理权限请求响应:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
可能是想使用第三方库来简化权限过程,这些库可以帮助你。
许可Dispatcher
德克斯特
RX许可
问题内容: 我正在测试我的应用,即使清单中已经定义了,它也会被强制关闭。我在某处已经读到,如果我在运行时请求权限,则不会强制关闭您的应用程序。我也已经阅读了这个android文档,用于请求运行时权限。 因此,我知道我们可以请求一个如下所示的权限,该权限在android文档中有所提及。 上面的代码具有获取结果的回调方法。 我的问题是要向用户确切请求权限?我们应该在应用启动时使用请求权限还是应该在需要
在Android Marshmallow中,当需要权限时,应该在运行时请求权限,而不是在安装应用程序时一次请求所有权限。然而,我似乎只能从活动中请求权限,这是一个问题,因为我的应用程序只包含服务。(你可能会问,这是为什么?该应用程序内置了一个Android Wear watch face,手机只需查找附近的照片即可发送到手表,无需任何活动。但它确实需要位置权限。) 那么,有没有办法向服务请求权限?
假设您有这样一种方法: 在整个应用程序中,如果要将文件保存到外部存储,可以执行以下操作。。。 这是一个简化的示例,所以不要讨论我关于阻止UI、正确处理异常等的情况。如果您不喜欢文件保存,您可以想象一个或或其他任何东西。关键是它是一个需要权限的操作,它返回一些值,并且在整个应用程序中使用。 在Android中 但是在新的Marshmallow(API 23)运行时权限模型中,在您可以将文件保存到外部
首先,我知道这是一个重复的问题,但我已经看过了其他类似问题的答案,没有找到成功的解决方案。 我已经开发了一款应用程序,可以在我的测试设备上完美运行,这是一款运行Android L(5.0.1)的三星S4。不过,我希望这款应用程序也能在较新版本的Android上运行。 我知道Android M的请求权限已更改,因此必须在运行时请求权限,但当我尝试实现此功能时,对话框从未出现,因此从未请求所需的权限。
我做错了什么?
问题内容: 我有用于调用操作的代码,并且我需要声明运行时权限的最佳方式IVE我尝试了许多代码,但我始终会出错 这是我的基本代码,任何有关使其具有运行时权限的建议,请先谢谢 } 问题答案: 在您的方法中尝试此代码 现在,调用创建一个单独的方法: 添加以下两种用于运行时权限检查的方法: 还要确保将其添加到清单中: 碎片 如果您在中尝试使用此代码 ,请更改 至 并且也改变 至