110/11 - 把照片储存在Pictures/应用程序名称资料夹 - 1

不太可能每个专案都那麽爽,可以把相片储存在内部储存空间/Android/data/packageName/files/,所以还是要练习把档案储存在内部储存空间/Pictures/应用程序名称资料夹/

100/09的画面继续,同样新增一颗MaterialButtonAppCompatImageView

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView 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=".CropLensActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.google.android.material.button.MaterialButton
            android:id="@+id/aclMbCreatePackageNamePicture"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="4dp"
            android:layout_marginEnd="8dp"
            android:padding="8dp"
            android:text="在应用程序资料夹建立照片"
            android:textAllCaps="false"
            app:autoSizeTextType="uniform"
            app:layout_constraintBottom_toTopOf="@+id/aclIvPackageNamePicture"
            app:layout_constraintDimensionRatio="5:1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_chainStyle="packed" />

        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/aclIvPackageNamePicture"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_margin="4dp"
            android:layout_marginTop="4dp"
            app:layout_constraintBottom_toTopOf="@+id/aclMbCreatePhonePicture"
            app:layout_constraintDimensionRatio="4:3"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/aclMbCreatePackageNamePicture"
            tools:src="@tools:sample/backgrounds/scenic" />

        <com.google.android.material.button.MaterialButton
            android:id="@+id/aclMbCreatePhonePicture"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="4dp"
            android:layout_marginEnd="8dp"
            android:padding="8dp"
            android:text="在图片资料夹建立照片"
            android:textAllCaps="false"
            app:autoSizeTextType="uniform"
            app:layout_constraintBottom_toTopOf="@+id/aclIvPhonePicture"
            app:layout_constraintDimensionRatio="5:1"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/aclIvPackageNamePicture" />

        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/aclIvPhonePicture"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_margin="4dp"
            android:layout_marginTop="4dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintDimensionRatio="4:3"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/aclMbCreatePhonePicture"
            tools:src="@tools:sample/backgrounds/scenic" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

我们拍照前先建立应用程序资料夹来存放相片,以下是建立资料夹的范例

private fun isCreateFolder(folderPath: File): Boolean {
    val file = File(folderPath, "AndroidSystem")
    return if (file.exists()) {
        true
    } else file.mkdir()
}

拍照点击事件,先判断资料夹有没有建立,有的话就继续执行

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_crop_lens)

    aclMbCreatePhonePicture.setOnClickListener {
    
        if (!isCreateFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES))) {
            Log.d("maho", "资料夹建立失败")
            return@setOnClickListener
        }
        
        val phoneFile = File(
            Environment.getExternalStoragePublicDirectory("${Environment.DIRECTORY_PICTURES}/AndroidSystem"),
            "002.jpg"
        )
        
        val uri = getPictureUri(phoneFile)
        
        takePictureResultLauncher.launch(uri)
    }
}

拍照完後一样重新整理,让相簿能显示我们储存的档案

private val takePictureResultLauncher =
    registerForActivityResult(ActivityResultContracts.TakePicture()) { isTakePicture ->
        
        if (!isTakePicture) {
            Log.d("maho", "拍照建立档案失败")
            return@registerForActivityResult
        }
        
        val packageNameFile =
            File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "001.jpg")
        val phoneFile = File(
            Environment.getExternalStoragePublicDirectory("${Environment.DIRECTORY_PICTURES}/AndroidSystem"),
            "002.jpg"
        )
        
        MediaScannerConnection.scanFile(
            this,
            arrayOf(packageNameFile.toString(), phoneFile.toString()),
            null
        ) { path, uri ->
            Log.d("maho", "${Thread.currentThread().name}  path: $path / uri: $uri")
        }
        
        aclIvPackageNamePicture.setImageURI(getPictureUri(packageNameFile))
        
        aclIvPhonePicture.setImageURI(null)
        aclIvPhonePicture.setImageURI(getPictureUri(phoneFile))
    }

感觉很完美对吧?但有个问题是getExternalStoragePublicDirectoryAndroid 11也被标记弃用,所以我们要换个方式写。


<<:  JavaScript学习日记 : Day14 - 原型与继承(一)

>>:  Kotlin Android 第21天,从 0 到 ML - Retrofit and Repository

【第二天 - Flutter 继承+建构子+CallBack 基本概念】

前言 今日的程序码 => GITHUB 继承 Flutter 会有三个方式 Extends 当...

除了刷题之外的事 - System Architecture

除了刷题之外的事 刷题是练习解决问题的能力的一种方法,而这里的「问题」主要是指演算法问题。但在实务...

Trouble with Distributed Systems (3-1) - Unreliable Clocks

不可靠的时钟 (Unreliable Clocks) 时钟对应用程序来说很重要,它可以回答以下问题:...

[Day26] Scrum失败经验谈 – Daily scrum变成daily report

在Scrum的机制里,每天的站立会议(Daily standup meeting)是一个极小体现Sc...

DAY22-导览设计之Sidebar

前言: 今天我们要来完成前面提到的Sidebar,我会从Navbar接着开始接着讲,那就让我们开始...