我找到了一个活动结果 api 的工作实现,用于通过相机和文件系统获取图像。代码是用 Kotlin 编写的,但我需要 Java。我尝试通过开发环境工具转换成java,但是输出代码不好。请帮忙。
import android.net.Uri
import android.os.Bundle
import android.widget.ImageView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import androidx.lifecycle.lifecycleScope
import com.google.android.material.button.MaterialButton
import java.io.File
class MainActivity : AppCompatActivity(R.layout.activity_main) {
private val takeImageResult = registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
if (isSuccess) {
latestTmpUri?.let { uri ->
previewImage.setImageURI(uri)
}
}
}
private val selectImageFromGalleryResult = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let { previewImage.setImageURI(uri) }
}
private var latestTmpUri: Uri? = null
private val previewImage by lazy { findViewById<ImageView>(R.id.image_preview) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setClickListeners()
}
private fun setClickListeners() {
findViewById<MaterialButton>(R.id.take_image_button).setOnClickListener { takeImage() }
findViewById<MaterialButton>(R.id.select_image_button).setOnClickListener { selectImageFromGallery() }
}
private fun takeImage() {
lifecycleScope.launchWhenStarted {
getTmpFileUri().let { uri ->
latestTmpUri = uri
takeImageResult.launch(uri)
}
}
}
private fun selectImageFromGallery() = selectImageFromGalleryResult.launch("image/*")
private fun getTmpFileUri(): Uri {
val tmpFile = File.createTempFile("tmp_image_file", ".png", cacheDir).apply {
createNewFile()
deleteOnExit()
}
return FileProvider.getUriForFile(applicationContext, "${BuildConfig.APPLICATION_ID}.provider", tmpFile)
}
}
清单代码片段
<application ..>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
provider_paths.xml 代码
<?xml version="1.0" encoding="utf-8"?>
<paths>
<cache-path
name="cached_files"
path="." />
<files-path
name="images"
path="." />
</paths>
为了您的方便,标记
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.card.MaterialCardView
android:id="@+id/image_preview_card"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="16dp"
app:cardElevation="8dp"
app:layout_constraintBottom_toTopOf="@id/button_barrier"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintDimensionRatio="16:9"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:alpha="0.25"
app:tint="@color/black" />
<ImageView
android:id="@+id/image_preview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
/>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.button.MaterialButton
android:id="@+id/take_image_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="4dp"
android:layout_marginBottom="16dp"
android:text="Take image"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/select_image_button"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" />
<com.google.android.material.button.MaterialButton
android:id="@+id/select_image_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="Select gallery-image"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/take_image_button" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/button_barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="top"
app:barrierMargin="16dp"
app:constraint_referenced_ids="take_image_button,select_image_button" />
</androidx.constraintlayout.widget.ConstraintLayout>
在 Java 中一对一地重写是不可能的,因为在方法中
takeImage
你运行一个协程。但是如果那里不需要协程调用,那么您的代码可以用 Java 重写如下: