Android開発、動的リクエスト権限(activateとfragment)
18188 ワード
画像の保存を要求する権限を例に挙げます.
1.Android Mainfestファイルに上記のコードブロック内の権限を追加する
2.イベントの傍受、購買依頼権限ダイアログ・ボックスのポップアップ
3.コールバックの結果、ユーザーが使用権限を許可するかどうか
クラスでonRequestPermissionsResult関数を再ロードする
2020.3.7号更新: Fragmentで権限を申請し、Activity Compat.を使用しないでください.requestPermissionsは、FragmentのrequestPermissionsメソッドを直接使用します.そうしないと、ActivityのonRequestPermissionsResult にコールバックします. FragmentにFragmentをネストする、サブFragmentでrequestPermissionsメソッドを使用すると、onRequestPermissionsResultはコールバックしないのでgetParentFragment()を使用することを推奨する.親FragmentのonRequestPermissionsResultにコールバックするrequestPermissionsメソッドです.コールバックを子Fragment に転送するには、次のコードを追加します.参照リンク:https://www.jianshu.com/p/b4a8b3d4f587
コードは次のとおりです.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
1.Android Mainfestファイルに上記のコードブロック内の権限を追加する
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gallery">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
<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>
2.イベントの傍受、購買依頼権限ダイアログ・ボックスのポップアップ
// ,
saveButton.setOnClickListener{
if (Build.VERSION.SDK_INT < 29 && ContextCompat.checkSelfPermission(
requireContext(),
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
// ,
requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 1)
} else {
// ,
viewLifecycleOwner.lifecycleScope.launch {
//lifecycleScope activity
savePhoto()
}
}
}
3.コールバックの結果、ユーザーが使用権限を許可するかどうか
クラスでonRequestPermissionsResult関数を再ロードする
//
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
//
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// ,
viewLifecycleOwner.lifecycleScope.launch {
//lifecycleScope activity
savePhoto()
}
} else {
// ,
Toast.makeText(requireContext(), " ", Toast.LENGTH_SHORT).show()
}
}
}
}
2020.3.7号更新:
コードは次のとおりです.
package com.example.image.vision
import android.Manifest
import android.content.pm.PackageManager
.....
import java.util.concurrent.TimeUnit
private const val REQUEST_CODE_PERMISSIONS = 10 //
private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA) //
class CameraXFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.camera_x_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
//
if (allPermissionsGranted()) {
Log.v(CameraXFragment::class.java.simpleName, " , ")
textureView.post { startCamera() }
} else {
Log.v(CameraXFragment::class.java.simpleName, " , ")
requestPermissions(REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
}
}
// ,
override fun onRequestPermissionsResult(
requestCode: Int, permissions: Array<String>, grantResults: IntArray
) {
Log.v(CameraXFragment::class.java.simpleName, " ")
if (requestCode == REQUEST_CODE_PERMISSIONS) {
if (allPermissionsGranted()) {
textureView.post { startCamera() }
} else {
Toast.makeText(
requireContext(),
"Permissions not granted by the user.",
Toast.LENGTH_SHORT
).show()
// , ,
activity?.finish()
}
}
}
// , , true
private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
requireContext(), it
) == PackageManager.PERMISSION_GRANTED
}
}