Android開発、動的リクエスト権限(activateとfragment)

18188 ワード

画像の保存を要求する権限を例に挙げます.
<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号更新:
  • Fragmentで権限を申請し、Activity Compat.を使用しないでください.requestPermissionsは、FragmentのrequestPermissionsメソッドを直接使用します.そうしないと、ActivityのonRequestPermissionsResult
  • にコールバックします.
  • FragmentにFragmentをネストする、サブFragmentでrequestPermissionsメソッドを使用すると、onRequestPermissionsResultはコールバックしないのでgetParentFragment()を使用することを推奨する.親FragmentのonRequestPermissionsResultにコールバックするrequestPermissionsメソッドです.コールバックを子Fragment
  • に転送するには、次のコードを追加します.
  • 参照リンク:https://www.jianshu.com/p/b4a8b3d4f587

  • コードは次のとおりです.
    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
        }
    }