首页 > 其他分享 >Android开发 registerForActivityResult 传值和申请动态权限

Android开发 registerForActivityResult 传值和申请动态权限

时间:2024-10-20 13:58:38浏览次数:1  
标签:zh Log androidx registerForActivityResult binding import Android 权限 传值

前言

  startActivityForResult() 被弃用,现在可以通过registerForActivityResult 进行Activity之间的传值和获取申请动态权限结果

Activity向上传值

MainActivity

package com.zh.demo
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.zh.demo.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        val activityResult =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
                if (it.resultCode == RESULT_OK) {
                    Log.e("zh", "返回数据 = ${it.data?.getStringExtra("data")}")
                }
            }

        binding.jump.setOnClickListener {
            activityResult.launch(Intent(this, DemoActivity::class.java))
        }
    }
}

DemoActivity

package com.zh.demo

import android.content.Intent
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import com.zh.demo.databinding.ActivityDemoBinding


class DemoActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        val binding = ActivityDemoBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.back.setOnClickListener {
            val intent = Intent()
            intent.putExtra("data", "返回的数据")
            setResult(RESULT_OK, intent)
            finish()
        }
    }
}

申请动态权限

package com.zh.demo
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.zh.demo.databinding.ActivityMainBinding
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.permission.setOnClickListener {
           requestPermission(listOf(android.Manifest.permission.CAMERA))
        }
    }

    private val requestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissionResults ->
            if(permissionResults.isEmpty()){
                Log.e("zh", "没有申请权限")
                return@registerForActivityResult
            }
            permissionResults.values
            var isGranted = true
            for(it in permissionResults.keys){
                Log.e("zh", "${it} >>>>> ${ContextCompat.checkSelfPermission(this@MainActivity, it)} ", )
                if(ContextCompat.checkSelfPermission(this@MainActivity, it) != PackageManager.PERMISSION_GRANTED){
                    isGranted = false
                }
                if(shouldShowRequestPermissionRationale(it)){
                    /*
                    用户之前拒绝了权限请求但未选择“禁止后不再询问”:当用户之前拒绝了某个权限的请求,但没有选择“禁止后不再询问”的选项时,再次请求该权限时,
                    shouldShowRequestPermissionRationale将返回true,表示此时应该向用户展示一个解释为什么需要这个权限的对话框。
                     */
                    Log.e("zh", "需要解释权限>>${it}")
                } else {
                     /*
                        1.从未请求过该权限:如果应用从未向用户请求过某个权限,那么shouldShowRequestPermissionRationale将返回false,因为此时不需要向用户解释权限请求的原因。
                        2.用户已禁止权限且选择了“禁止后不再询问”:当用户之前拒绝了权限请求,并且选择了“禁止后不再询问”的选项,再次请求该权限时,shouldShowRequestPermissionRationale也会返回false,因为系统不会再次弹出权限请求对话框,而是需要用户手动在应用设置中开启权限。
                        3.用户已允许权限:如果用户已经允许了某个权限,那么再次请求该权限时,shouldShowRequestPermissionRationale也会返回false,因为权限已经被授予,无需再向用户解释。
                      */
                    Log.e("zh", "无需解释权限>>${it}")
                }
            }
            if(!isGranted){
                Log.e("zh", "权限被拒绝")
                return@registerForActivityResult
            }
        }

    fun requestPermission(
        permissions: List<String>,
    ) {
        lifecycleScope.launch {
            //repeatOnLifecycle 需要引入   implementation ("androidx.lifecycle:lifecycle-runtime-ktx:2.5.1")
            repeatOnLifecycle(Lifecycle.State.CREATED) {
                val notGrantedList = permissions.filter { ContextCompat.checkSelfPermission(this@MainActivity, it) != PackageManager.PERMISSION_GRANTED }
                if(notGrantedList.isEmpty()){
                    Log.e("zh", "已经被全部授权了")
                    return@repeatOnLifecycle
                }
                requestPermissionLauncher.launch(notGrantedList.toTypedArray())
            }
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

End

标签:zh,Log,androidx,registerForActivityResult,binding,import,Android,权限,传值
From: https://www.cnblogs.com/guanxinjing/p/18487224

相关文章

  • 编译Android14遇到lunch不显示target的问题
    参考Android系统源码编译https://xdaforums.com/t/lunch-failed.4665348/https://www.huigll.com/cannot-display-lunch-menu/现象android-14.0.0_r74$.build/envsetup.shandroid-14.0.0_r74$lunchYou'rebuildingonLinuxWarning:Cannotdisplaylunchmenu.......
  • 基于node.js+vue基于Android的高校教材选用平台的设计与实现(开题+程序+论文)计算机毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于高校教材选用平台的研究,现有研究主要集中在基于Web的通用教材管理系统方面,专门针对基于Android的高校教材选用平台的研究较少。在高校教材管理领域,......
  • 6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss
    对话框对话框(Dialog)是一种常用的UI组件,它主要用于显示信息、接收用户操作反馈对话框可以包含各种元素,但是主要还是以文本、按钮为主,其次是列表其中,基础对话框是Android中最简单的对话框,而后是进度对话框、自定义对话框等一、UI线程问题1、UI线程中创建对话......
  • 基于node.js+vue基于Android办公系统设计(开题+程序+论文)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于Android办公系统的设计,现有研究主要集中在通用性办公软件的开发与优化,如文档编辑、邮件处理等方面。专门针对包含员工工作安排、工作提交、员工考勤......
  • Android按钮Button
    Button是程序用于和用户进行交互的一个重要控件。Button也是继承自TextView,既可以显示文本,又可以显示图片,二者在UI上的区别主要是Button控件有个按钮外观,提示用户单击。图1Button示意图Button最主要的功能是通过单击来执行指定的操作,当用户单击Button后,Button会触发一......
  • windows安装Android studio并运行显示"hello world"
    闲言本次流程的最终实现目的,正确安装AndroidStudio,并实现运行成功希望能帮到大家目录闲言安装前准备下载AndroidStudio安装新建项目第一次创建情况如果proxy未在创建新项目时出现运行创建虚拟机运行虚拟机碎语安装前准备下载AndroidStudio官网链接https://devel......
  • 在不丢失数据的情况下解锁锁定的 Android 手机的 4 种方法
    尽管您可以使用指纹解锁手机,但大多数智能手机都需要PIN码、图案或字母数字代码作为主密码。如果您有一段时间没有输入手机密码,很容易忘记。正是由于这个原因,即使您打开了指纹解锁,大多数智能手机也会让您每天至少输入一次PIN。即使采取了所有这些额外措施,您仍有可能忘记手机......
  • Android14———Launcher去除抽屉模式的实现,将所有app显示在桌面上
    1、首先需要增加一个标志flag,通过true或者false进行是否去除抽屉模式的表达。FeatureFlags.javapublicstaticfinalbooleanREMOVE_DRAWER=true;2、将allApp显示到桌面Workspace上LoaderTask.java先导包:importandroid.util.Pair;importjava.util.function.......
  • Android 13.0 Launcher3定制之首页时钟小部件字体大小修改
    1.前言在13.0的系统rom产品开发中,在一些Launcher3的定制化开发中,在对于一些小屏幕的产品开发中,在首页添加时钟小部件会显得字体有点小,所以为了整体布局美观就需要改动小部件的布局日期字体的大小来实现整体的布局美观效果,接下来来具体实现相关的功能具体效果图:2.Launcher......
  • 【Android学习】UI基础
    在Android开发中,用户界面(UserInterface,简称UI)是用户与应用交互的桥梁,UI设计的好坏直接影响用户的体验。所有的用户界面元素都是View和ViewGroup的对象构成的。View是绘制在屏幕上的用户能与之交互的一个对象。而ViewGroup则是一个用于存放其他View(和ViewGroup)对象的布局容器。......