registerForActivityResult() 是startActivity() 的替换方法,它囊括了更多的功能回调,并且可以赋值给对象,通过 xxx.launch() 方法重复使用。
1.StartActivityForResult()
回调 it:ActivityResult!
resultCode 有三种 分别为 :
RESULT_OK,RESULT_ERROR,RESULT_CANCELED
val startActivity= registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
//首先判断resultCode
if (it.resultCode == RESULT_OK){
//后续对data进行操作...
//data 是 intent 类型的
it.data.getIntExtra()
}else{}
}
跳转activity
startActivity.launch(mIntent)
在第二个activity进行回调传参
setResult(RESULT_OK,intent)
2.权限请求
单个权限请求
val requestCameraPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
//做后续操作
} else {
// 权限被拒绝就要提醒
}
}
requestCameraPermission.launch(Manifest.permission.CAMERA)
多权限请求
注意:多权限请求 返回的是map类型参数,所以需要获取map中所有的value来进行判断是否拿到所有权限
requestMultiplePermission.launch(arrayOf(Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE))
val requestMultiplePermission =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result: Map<String, Boolean> ->
if (result[Manifest.permission.CAMERA] == true && result[Manifest.permission.READ_EXTERNAL_STORAGE] == true){
//权限全部获取后的操作
}else{
//没有全部获取的操作
}
}
3.文件选择
需要在launch()中写入MIME Type
//获取相册图片
selectFile .launch("image/*")
//获取视频
selectFile .launch("video/*")
//获取音频
selectFile .launch("audio/*")
//txt类型文件
selectFile .launch("text/plain")
//pdf类型文件
selectFile .launch("application/pdf")
//Microsoft Word文件
selectFile .launch("application/msword")
val selectPhoto = registerForActivityResult(ActivityResultContracts.GetContent()){result:Uri ->
if (result!=null){//返回图片的uri
val bitmap=BitmapFactory.decodeStream(contentResolver.openInputStream(result))
}
}
注意:使用GetContent()文件选择器 是无法直接打开相册 需要用户自行选择打开 如下图所示
所以如果需要优化用户体验 则仍需使用 startActivityForResult()

例:
Intent().also {
it.action=Intent.ACTION_PICK
it.data=MediaStore.Images.Media.EXTERNAL_CONTENT_URI
startActivityForResult(it, Content.TAKE_ALBUM_REQUEST)
}
4.拍照
拍照有两个方法:
TakePicturePreview() 方法 是直接获取的相机预览界面,返回bitmap
TakePicture() 保存到本地 返回 uri
启动方法:
launch(null)
launch(uri) 照片保存路径
private val takePhoto =
registerForActivityResult(ActivityResultContracts.TakePicturePreview()) {
}
private val takePhoto registerForActivityResult(ActivityResultContracts.TakePicture())
{
}
5.创建文件
返回创建文件的uri
启动:
launch(“image.jpg”) 文件名+后缀
private val createDocument = registerForActivityResult(ActivityResultContracts.CreateDocument()) {
}
6.选择联系人电话
private val pickContact = registerForActivityResult(ActivityResultContracts.PickContact()) { uri ->
val cursor:Cursor?=mContext.contentResolver.query(uri,null,null,null,null)
cursor?.let { cursor ->
while (cursor.moveToNext()){
//联系人id
val contactId:String=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
//联系人姓名
val contactName=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
val phones=contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId,
null,null
)
phones?.let {
while (it.moveToNext()){
//联系人电话
val phoneNumber=it.getString(it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
}
it.close()
}
}
cursor.close()
}
}
启动:在请求前需要先请求 Manifest.permission.READ_CONTACTS 权限
val requestPermission =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
pickContact.launch(null)
} else {
// 权限被拒绝就要提醒
//showSettingDialog()
}
}
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>
我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans
我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=
我是Ruby的新手,发现以下几对令人困惑示例同样有效:File.included_modulesFile::included_modulesFile.stat('mbox')#Returnsa'#'objectFile::stat('mbox')File.new("foo.txt","w")File::new("foo.txt","w")"asdf".size#Aninstancemethod"asdf"::size2+32::send(:+,3)#AnextremeexampleFile::new,尤其是我经常遇到的东西。我的问题:如果我永远避免使用::运算符来限定除类、模块和常量之
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就