Android Kotlin接收分享代码报错,是缺导入还是有多余代码?
问题原因梳理
- 类结构层级错误:
onCreate方法的结束括号位置错误,将handleSendText/handleSendImage/handleSendMultipleImages三个成员方法、companion object都定义到了onCreate的内部作用域中,属于非法的局部类成员定义,触发局部扩展属性、变量未初始化等错误。 - View实例未初始化:没有从布局中绑定
textView、first_imageView、second_imageView三个控件实例,直接引用触发未解析引用错误;同时给控件赋值时多余加了val关键字,被编译器误判为要定义局部扩展属性。 - 集合访问语法错误:多张图片读取时用了圆括号
it(0)访问集合元素,Kotlin集合下标访问需要用方括号it[0],圆括号会被识别为invoke函数调用,触发类型不匹配错误。 - 语法转义残留:代码中混入了HTML转义字符(比如
->对应->、"对应双引号),属于非法字符,触发语法错误。 when分支未穷尽:内层的when没有定义else分支,不符合Kotlinwhen表达式的穷尽要求。- 多余导入:导入了
TextView、ImageView但未用来声明控件变量,触发未使用导入警告。
修复后完整代码
package com.example.myapplication2 import android.content.Intent import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.os.Parcelable import android.widget.TextView import android.widget.ImageView class MainActivity : AppCompatActivity() { // 声明控件变量 private lateinit var textView: TextView private lateinit var firstImageView: ImageView private lateinit var secondImageView: ImageView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 从布局绑定控件,ID需和activity_main.xml中的控件ID对应 textView = findViewById(R.id.textView) firstImageView = findViewById(R.id.first_imageView) secondImageView = findViewById(R.id.second_imageView) when { intent?.action == Intent.ACTION_SEND -> { when (intent.type) { PLAIN_TEXT_MIME -> handleSendText(intent) else -> if (intent.type?.startsWith(MEDIA_IMAGE_MIME) == true) { handleSendImage(intent) } } } intent?.action == Intent.ACTION_SEND_MULTIPLE -> { if (intent.type?.startsWith(MEDIA_IMAGE_MIME) == true) { handleSendMultipleImages(intent) } } } } private fun handleSendText(intent: Intent) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { textView.text = it } } private fun handleSendImage(intent: Intent) { (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let { firstImageView.setImageURI(it) } } private fun handleSendMultipleImages(intent: Intent) { intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let { list -> // 增加大小判断避免数组越界 if (list.size >= 1) { firstImageView.setImageURI(list[0] as? Uri) } if (list.size >= 2) { secondImageView.setImageURI(list[1] as? Uri) } } } companion object { private const val PLAIN_TEXT_MIME = "text/plain" private const val MEDIA_IMAGE_MIME = "image/" } }
额外配置说明
接收系统分享还需要在AndroidManifest.xml中给MainActivity配置对应的intent-filter,否则无法响应系统分享请求,配置示例:
<activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- 接收文本分享 --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <!-- 接收单张图片分享 --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <!-- 接收多张图片分享 --> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
内容的提问来源于stack exchange,提问作者Soccer05
相关产品推荐
相关产品推荐

