lmw
2023-06-16 03972ad1d3ce6ffe0be0395c0a4d5dcb4474031f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
package cn.sinata.xldutils.activity
 
import android.Manifest
import android.app.Activity
import android.content.ContentValues
import android.content.Intent
import android.database.Cursor
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.loader.app.LoaderManager
import androidx.loader.content.CursorLoader
import androidx.loader.content.Loader
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import cn.sinata.xldutils.R
import cn.sinata.xldutils.adapter.BaseRecyclerAdapter
import cn.sinata.xldutils.adapter.util.ViewHolder
import cn.sinata.xldutils.utils.isFilePath
import cn.sinata.xldutils.view.SwipeRefreshRecyclerLayout
import com.facebook.drawee.view.SimpleDraweeView
import com.tbruyelle.rxpermissions2.RxPermissions
import org.jetbrains.anko.backgroundColor
import org.jetbrains.anko.imageResource
import org.jetbrains.anko.toast
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
 
/**
 * 选择照片,可多选。(单选还么写。。)
 */
class SelectPhotoActivity : RecyclerActivity() {
 
    companion object {
        const val MAX = "max"
        const val SELECT_LIST = "selectList"
    }
 
    private var tempFile: File? = null
    var maxNumber = 100//默认最多可选100个
    val imagePaths = ArrayList<Image>()
    val selectImages = ArrayList<String>()
    val LOADER_ALL: Int = 0
    val defaultTakePhoto = Image("res:///" + R.drawable.ic_camera_alt_24dp)
    private val imageAdapter by lazy {
        ImageAdapter()
    }
 
    override fun adapter(): RecyclerView.Adapter<*> {
        return imageAdapter
    }
 
    override fun mode(): SwipeRefreshRecyclerLayout.Mode {
        return SwipeRefreshRecyclerLayout.Mode.None
    }
 
    override fun layoutManager(): RecyclerView.LayoutManager {
        return GridLayoutManager(this, 3)
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        rootFl.backgroundColor = Color.parseColor("#F3F3F3")
//        permission(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE,
//                Manifest.permission.CAMERA)
//
//                ,"运行必须的权限",12)
        RxPermissions(this).request(Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA).subscribe { }
 
        titleBar.addRightButton("完成", onClickListener = View.OnClickListener {
            if (selectImages.size == 0) {
                toast("您还没选择图片!")
                return@OnClickListener
            }
            val data = Intent()
            data.putStringArrayListExtra(SELECT_LIST, selectImages)
            setResult(Activity.RESULT_OK, data)
            finish()
        })
 
        maxNumber = intent.getIntExtra(MAX, 100)
        val temp = intent.getStringArrayListExtra(SELECT_LIST)
        if (temp != null) {
            selectImages.addAll(temp)
        }
        //拍照按钮
        imagePaths.add(defaultTakePhoto)
        imageAdapter.notifyDataSetChanged()
 
        supportLoaderManager.initLoader<Cursor>(LOADER_ALL, null, mLoaderCallback)
    }
 
    private val mLoaderCallback = object : LoaderManager.LoaderCallbacks<Cursor> {
        private val IMAGE_PROJECTION = arrayOf(MediaStore.Images.Media.DATA,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.DATE_ADDED,
                MediaStore.Images.Media.MIME_TYPE,
                MediaStore.Images.Media.SIZE,
                MediaStore.Images.Media._ID)
 
        override fun onLoaderReset(loader: Loader<Cursor>) {
 
        }
 
        override fun onLoadFinished(loader: Loader<Cursor>, data: Cursor?) {
            if (data != null) {
                if (data.count > 0) {
                    data.moveToFirst()
                    imagePaths.clear()
                    imagePaths.add(defaultTakePhoto)
                    do {
                        val path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]))
                        val name = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]))
                        if (path.isFilePath()) {
                            val image = Image(path)
                            if (selectImages.contains(path)) {
                                image.isSelected = true
                            }
                            imagePaths.add(image)
                        }
                    } while (data.moveToNext())
                    imageAdapter.notifyDataSetChanged()
                }
            }
        }
 
        override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> {
            return CursorLoader(this@SelectPhotoActivity,
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
                    IMAGE_PROJECTION[4] + ">0 AND " + IMAGE_PROJECTION[3] + "=? OR " + IMAGE_PROJECTION[3] + "=? ",
                    arrayOf("image/jpeg", "image/png"), IMAGE_PROJECTION[2] + " DESC")
        }
    }
 
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 0) {
                //拍照
                if (tempFile != null && tempFile!!.exists()) {
                    //notify system
                    sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(tempFile)))
                    //重新加载数据
                    supportLoaderManager.initLoader<Cursor>(LOADER_ALL, null, mLoaderCallback)
                }
            }
        }
    }
 
    private inner class ImageAdapter : BaseRecyclerAdapter<Image>(imagePaths, R.layout.item_select_photo_image) {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            val viewHolder = super.onCreateViewHolder(parent, viewType)
 
            return viewHolder
        }
 
        override fun onBind(holder: ViewHolder, position: Int, data: Image) {
            val stateView = holder.bind<TextView>(R.id.action_state)
            val imageView = holder.bind<SimpleDraweeView>(R.id.imageView)
 
            //不是拍照
            if (position != 0) {
                imageView.setImageURI(Uri.parse("file://" + data.path))
                stateView.visibility = View.VISIBLE
                stateView.isSelected = data.isSelected
                if (data.isSelected) {
                    stateView.text = (selectImages.indexOf(data.path) + 1).toString()
                } else {
                    stateView.text = null
                }
            } else {
                stateView.visibility = View.GONE
                imageView.imageResource = R.drawable.ic_camera_alt_24dp
                imageView.scaleType = ImageView.ScaleType.CENTER_INSIDE
            }
 
            stateView.setOnClickListener {
                val selected = data.isSelected
                //本是选中状态
                if (selected) {
                    if (selectImages.contains(data.path)) {
                        selectImages.remove(data.path)
                    }
                } else {
                    if (selectImages.size >= maxNumber) {
                        toast("最多选择" + maxNumber + "张图片")
                        return@setOnClickListener
                    }
                    selectImages.add(data.path)
                }
                data.isSelected = !selected
                notifyDataSetChanged()
            }
            imageView.setOnClickListener {
                //拍照
                if (position == 0) {
                    takePhoto()
                }
            }
        }
    }
 
    fun takePhoto() {
        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        // Create an image file name
        val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val imageFileName = "IMG_$timeStamp.jpg"
        //path 最好不使用data目录。如果需要通知系统刷新图库,data目录的文件其他应用没有访问权限,会无效。
        val path = Environment.getExternalStorageDirectory().absolutePath + "/DCIM/Camera/"
        val storageDir = File(path)
        if (!storageDir.exists()) {
            storageDir.mkdirs()
        }
        val image = File(storageDir, imageFileName)
        tempFile = image
        val u = Uri.fromFile(tempFile)
        intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0)
        //7.0崩溃问题
        if (Build.VERSION.SDK_INT < 24) {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, u)
        } else {
            val contentValues = ContentValues(1)
            contentValues.put(MediaStore.Images.Media.DATA, tempFile?.absolutePath)
            val uri = this@SelectPhotoActivity.contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
        }
        startActivityForResult(intent, 0)
    }
 
    data class Image(val path: String, var isSelected: Boolean = false)
}