私のウィジェットは、Activity
スコープ外のセキュリティで保護されたアクセス許可を呼び出します。 Android Mの許可をActivity
の外にリクエストすることはできますか?
いいえ、できません。できることは、ユーザーがタップし、アクティビティを使用して許可を要求/管理できる通知を送信することです(ダイアログテーマを使用する場合があります)。
Easy Permissions ライブラリを使用できます。
Androidでは、これらのリクエストはActivity
からのものである必要があります。 Easy Permissionsを使用すると、これは問題ではなくなり、Context
を指定する限り、どこからでも許可をリクエストできます。また、既に付与されているアクセス許可を要求した場合、ユーザーにはプロンプトが表示されません。
完全な開示により、当社はこの無料のライブラリを管理および開発しています。そうは言っても、私たちはそれが有用なツールであると確信しており、そうでなければ共有しません。
アクティビティまたはフラグメントからのみ許可をリクエストできます。
アプリが許可を必要とすると感じるアクティビティまたはフラグメントのポイントを見つけて、requestPermissionメソッドを呼び出します。要求されたアクセス許可を取得するまでコード処理を行い、onRequestPermissionResult()メソッドから機能を再開するため、通知の送信は機能しません。
メソッドを使用している限り、アクティビティの外部で許可をリクエストすることは可能だと思います
ActivityCompat.requestPermissions(アクティビティアクティビティ、String []パーミッション、int requestCode)
サポートライブラリから、メソッドのパラメーターとしてアクティビティを渡します。
例えば:
ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);
ここで、targetActivityはメソッドを実装するアクティビティです。
onRequestPermissionsResult(int requestCode、String [] permissions、int [] grantResults)
これは、許可解除リクエストの結果を処理するメソッドです。
私はうまくいくように見える回避策を見つけました。秘Theは、パーミッションをリクエストするためだけに存在し、その後すぐに終了する透過的なアクティビティを作成することです。もちろんコンテキストが必要ですが、アクティビティである必要はありません。アクティビティは、ブロードキャストを介して結果(許可または拒否)を返すことができます(アクティビティ以外では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() {
// ...
}
}