我的小工具在Activity
范围之外进行安全权限调用。是否可能在Activity
之外请求Android M的权限?
我的小工具在Activity
范围之外进行安全权限调用。是否可能在Activity
之外请求Android M的权限?
startActivtyForResult
。import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.support.v7.app.AppCompatActivity
internal const val PERMISSIONS_KEY = "permissions"
internal const val ACTION_PERMISSIONS_GRANTED = "GetPermissionsActivity.permissions_granted"
internal const val ACTION_PERMISSIONS_DENIED = "GetPermissionsActivity.permissions_denied"
class GetPermissionsActivity: AppCompatActivity() {
private val permissionRequestCode = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ActivityCompat.requestPermissions(
this,
intent.getStringArrayExtra(PERMISSIONS_KEY),
permissionRequestCode
)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode == permissionRequestCode) {
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
sendBroadcast(Intent(ACTION_PERMISSIONS_GRANTED))
} else {
sendBroadcast(Intent(ACTION_PERMISSIONS_DENIED))
}
finish()
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
}
这是用于活动的样式
<style name="Theme.Transparent" parent="Theme.AppCompat">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowAnimationStyle">@null</item>
</style>
<activity android:name="GetPermissionsActivity" android:theme="@style/Theme.Transparent" />
class SomeClass : BroadcastReceiver() {
private fun someFunction(context: Context) {
val intentFilter = IntentFilter()
intentFilter.addAction(ACTION_PERMISSIONS_GRANTED)
intentFilter.addAction(ACTION_PERMISSIONS_DENIED)
context.registerReceiver(this, intentFilter)
val intent = Intent(context, GetPermissionsActivity::class.java)
intent.putExtra(PERMISSIONS_KEY, arrayOf(<your permissions>))
context.startActivity(intent)
}
override fun onReceive(context: Context, intent: Intent) {
when {
intent.action == ACTION_PERMISSIONS_GRANTED -> {
context.unregisterReceiver(this)
onPermissionsGranted()
}
intent.action == ACTION_PERMISSIONS_DENIED -> {
context.unregisterReceiver(this)
onPermissionsDenied()
}
else -> super.onReceive(context, intent)
}
}
private fun onPermissionsGranted() {
// ...
}
private fun onPermissionsDenied() {
// ...
}
}
Activity
。使用Easy Permissions就不再是问题了,只要提供Context
,你可以从任何地方请求权限。此外,如果你请求的权限已经被授予,用户将不会收到提示。
完全透明地说,我们的公司管理和开发这个免费使用的库。话虽如此,我们有信心它是一个有用的工具,否则我们不会分享它。
我认为可以在Activity外部请求权限,只要使用支持库中的方法
ActivityCompat.requestPermissions(Activity activity, String[] permissions, int requestCode)
并将Activity作为该方法的参数传递。
例如:
ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);
其中,targetActivity是应该实现该方法的Activity:
onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
这是处理权限请求结果的方法。
AppWidgetProvider
中设置权限?还是应该将其放在我的RemoteViewsService.RemoteViewsFactory
中?我的小部件中的ListView
需要检查位置。 - natsumiyu你只能从Activity或Fragment请求权限。
确定您的应用程序需要权限的Activity或Fragment中的某个点,然后调用requestPermission方法。发送通知无法起作用,因为您希望您的代码在获得所请求的权限之前一直处理,并从onRequestPermissionResult()方法恢复功能。
public class CheckForPermissions implements ActivityCompat.OnRequestPermissionsResultCallback {
private static final int MY_PERMISSIONS_REQUEST_READ_LOCATION = 1;
public static void checkForLocationPermissions(Activity context){
if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(context,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_READ_LOCATION);
}
}}
CheckForPermissions.checkForLocationPermissions(this);