WrathChaos / MediaPickerLib

Kotlin based media picker library, to pick multiple images and/or vidoes from built-in gallery. Easy to implement and use :)
https://www.freakycoder.com
MIT License
49 stars 16 forks source link

MediaPickerLib

Kotlin based media picker library, to pick multiple images and/or vidoes from built-in gallery. Easy to implement and use :)

awesome_kotlin licence Jitpack API Maintenance

Setup

Add this on your module:app build.gradle

allprojects {
  repositories {
    ...
    maven { url 'https://jitpack.io' }
  }
}

Gradle

implementation 'com.github.WrathChaos:MediaPickerLib:0.2.0'

Usage

This is the request code to handle and get the picked images/videos
private val OPEN_MEDIA_PICKER = 1  // Request code
You need to import Gallery from MediaPickerLib and send mandatory intents to work
val intent = Intent(this, Gallery::class.java)
// Set the title for toolbar
intent.putExtra("title", "Select media")
// Mode 1 for both images and videos selection, 2 for images only and 3 for videos!
intent.putExtra("mode", 1)
intent.putExtra("maxSelection", 3) // Optional
startActivityForResult(intent, OPEN_MEDIA_PICKER)
Receive what you picked here: This is an example from sample project, you can handle whatever you want with the path :)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    // Check which request we're responding to
    if (requestCode == OPEN_MEDIA_PICKER) {
        // Make sure the request was successful
        if (resultCode == Activity.RESULT_OK && data != null) {
            val selectionResult = data.getStringArrayListExtra("result")
            selectionResult.forEach {
                try {
                    Log.d("MyApp", "Image Path : " + it)
                    val uriFromPath = Uri.fromFile(File(it))
                    Log.d("MyApp", "Image URI : " + uriFromPath)
                    // Convert URI to Bitmap
                    val bm = BitmapFactory.decodeStream(
                            contentResolver.openInputStream(uriFromPath))
                    image.setImageBitmap(bm)
                } catch (e: FileNotFoundException) {
                    e.printStackTrace()
                }
            }
        }
    }
}

Full Working Example

If you need more spesific example, please look at the Example

package com.example.myapplication

import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.ColorStateList
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import com.coursion.freakycoder.mediapicker.galleries.Gallery
import com.google.android.material.floatingactionbutton.FloatingActionButton
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.content_main.*
import java.io.File
import java.io.FileNotFoundException
import android.provider.MediaStore
import java.io.ByteArrayOutputStream

class MainActivity : AppCompatActivity() {
    private val OPEN_MEDIA_PICKER = 1  // Request code
    private val MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 100 // Request code for read external storage

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        setButtonTint(fab, ContextCompat.getColorStateList(applicationContext, R.color.fabColor)!!)
        fab.setOnClickListener { view ->
            if (!permissionIfNeeded()) {
                val intent = Intent(this, Gallery::class.java)
                // Set the title
                intent.putExtra("title", "Select media")
                // Mode 1 for both images and videos selection, 2 for images only and 3 for videos!
                intent.putExtra("mode", 1)
                intent.putExtra("maxSelection", 3) // Optional
                intent.putExtra("tabBarHidden", true) //Optional - default value is false
                startActivityForResult(intent, OPEN_MEDIA_PICKER)
            }
        }
    }

    fun setButtonTint(button: FloatingActionButton, tint: ColorStateList) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            button.backgroundTintList = tint
        } else {
            ViewCompat.setBackgroundTintList(button, tint)
        }
    }

    private fun permissionIfNeeded(): Boolean {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
                // Should we show an explanation?
                if (shouldShowRequestPermissionRationale(
                        Manifest.permission.READ_EXTERNAL_STORAGE)) {
                    // Explain to the user why we need to read the contacts
                }

                requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                    MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE)
                return true
            }
        }
        return false
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // Check which request we're responding to
        if (requestCode == OPEN_MEDIA_PICKER) {
            // Make sure the request was successful
            if (resultCode == Activity.RESULT_OK && data != null) {
                val selectionResult = data.getStringArrayListExtra("result")
                selectionResult.forEach {
                    try {
                        Log.d("MyApp", "Image Path : " + it)
                        val uriFromPath = Uri.fromFile(File(it))
                        Log.d("MyApp", "Image URI : " + uriFromPath)
                        // Convert URI to Bitmap
                        val bm = BitmapFactory.decodeStream(
                            contentResolver.openInputStream(uriFromPath))
                        val uri = getImageUriFromBitmap(applicationContext, bm)
                        Log.d("MyApp", "URI: " + uri)
                        image.setImageBitmap(bm)
                    } catch (e: FileNotFoundException) {
                        e.printStackTrace()
                    }
                }
            }
        }
    }

    fun getImageUriFromBitmap(context: Context, bitmap: Bitmap): Uri{
        val bytes = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
        val path = MediaStore.Images.Media.insertImage(context.contentResolver, bitmap, "Title", null)
        return Uri.parse(path.toString())
    }
}

Customization

You can customize the color of the library (More customization features is coming soon)

Title and back's button color

 <color name="titleTextColor">#ffffff</color>  

Unselected image and video's tab title

 <color name="titleTabColor">#afafaf</color>   

Selected image and video's tab title

<color name="titleSelectedTabColor">#ffffff</color>

Gallery's fab button color

<color name="fabColor">#931931</color>

Fork

This is original a fork from multiple-media-picker | Currently not working

Thanks for inspiration Erikagtierrez :)

Author

FreakyCoder, kurayogun@gmail.com

License

MediaPickerLib is available under the MIT license. See the LICENSE file for more info.