Skip to content

Instantly share code, notes, and snippets.

@worker8
Created January 23, 2019 09:42
Show Gist options
  • Save worker8/46126a7497611f657c8d07344c3e5545 to your computer and use it in GitHub Desktop.
Save worker8/46126a7497611f657c8d07344c3e5545 to your computer and use it in GitHub Desktop.
/* // use side
* channelAvatarPicture.setOnClickListener {
* startActivityForResult(Intent(this@ChannelActivity, ImagePickingActivity::class.java), ImagePickingActivity.REQUEST_IMAGE_CAPTURE)
* }
* override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
* super.onActivityResult(requestCode, resultCode, data)
* if (requestCode == ImagePickingActivity.REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
* data?.getStringExtra(ImagePickingActivity.CHOSEN_IMAGE_PATH)?.ofType<String> { chosenImagePath ->
* // use 'chosenImagePath'
* }
* }
* }
* // AndroidManifest.xml
* <uses-permission android:name="android.permission.CAMERA" />
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
* <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
*/
import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.support.v7.app.AppCompatActivity
import jp.co.zeppelin.feelit.android.app.extension.ofType
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.text.SimpleDateFormat
import java.util.*
class ImagePickingActivity : AppCompatActivity() {
companion object {
val CAMERA_REQUEST_CODE = 63254
val REQUEST_IMAGE_CAPTURE = 3737
val REQUEST_CAMERA = 23244
val CHOSEN_IMAGE_PATH = "CHOSEN_IMAGE_PATH"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (ContextCompat.checkSelfPermission(this@ImagePickingActivity, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this@ImagePickingActivity,
arrayOf(Manifest.permission.CAMERA), CAMERA_REQUEST_CODE)
} else {
// Permission has already been granted
dispatchTakePictureIntent()
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
CAMERA_REQUEST_CODE -> {
// If request is cancelled, the result arrays are empty.
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
dispatchTakePictureIntent()
} else {
finish()
}
return
}
else -> {
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (resultCode) {
Activity.RESULT_CANCELED -> {
finish()
}
Activity.RESULT_OK -> {
if (requestCode == REQUEST_CAMERA) {
val bitmap = data?.extras?.get("data")
bitmap?.ofType<Bitmap> {
val filePath = bitmapToFile(it)
setResult(Activity.RESULT_OK, Intent().apply { putExtra(CHOSEN_IMAGE_PATH, filePath) })
finish()
}
}
}
else -> {
}
}
}
@SuppressLint("SimpleDateFormat")
@Throws(IOException::class)
private fun createImageFile(): File {
// Create an image file name
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
val storageDir: File = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
val file = File.createTempFile(
"JPEG_${timeStamp}_", /* prefix */
".jpg", /* suffix */
storageDir /* directory */
)
return file
}
private fun bitmapToFile(bitmap: Bitmap): String {
//create a file to write bitmap data
val file = createImageFile()
//Convert bitmap to byte array
val byteArrayOutputStream: ByteArrayOutputStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, byteArrayOutputStream)
val bitmapdata = byteArrayOutputStream.toByteArray()
//write the bytes in file
val fileOutputStream = FileOutputStream(file)
fileOutputStream.write(bitmapdata)
fileOutputStream.flush()
fileOutputStream.close()
return file.absolutePath
}
private fun dispatchTakePictureIntent() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
takePictureIntent.resolveActivity(packageManager)?.also {
startActivityForResult(takePictureIntent, REQUEST_CAMERA)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment