Skip to content

Commit

Permalink
- Fix #11
Browse files Browse the repository at this point in the history
- Fix #19
  • Loading branch information
rock-tran committed Sep 8, 2020
1 parent a75df95 commit 45a2a97
Show file tree
Hide file tree
Showing 13 changed files with 91 additions and 97 deletions.
2 changes: 2 additions & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 5 additions & 29 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions build.gradle
Expand Up @@ -9,10 +9,10 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
classpath 'com.android.tools.build:gradle:4.0.1'
classpath deps.kotlin.plugin
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Tue Sep 04 17:12:37 ICT 2018
#Tue Jan 15 13:47:56 ICT 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
16 changes: 9 additions & 7 deletions mediapicker/src/main/AndroidManifest.xml
@@ -1,25 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="vn.tungdx.mediapicker">
package="vn.tungdx.mediapicker">

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<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" />
<uses-permission android:name="android.permission.CAMERA" />

<application>
<activity
android:name="vn.tungdx.mediapicker.activities.MediaPickerActivity"
android:screenOrientation="portrait"
android:theme="@style/MediaPickerTheme"/>
android:theme="@style/MediaPickerTheme" />

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">

<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
android:resource="@xml/file_paths" />

</provider>

</application>
Expand Down
7 changes: 3 additions & 4 deletions mediapicker/src/main/java/vn/tungdx/mediapicker/MediaItem.kt
Expand Up @@ -132,13 +132,12 @@ class MediaItem : Parcelable {
return uri.path
} else if (scheme == ContentResolver.SCHEME_CONTENT) {
return if (isPhoto) {
MediaUtils.getRealImagePathFromURI(
context.contentResolver, uri)
MediaUtils.getRealImagePathFromURI(context.contentResolver, uri)
} else {
MediaUtils.getRealVideoPathFromURI(
context.contentResolver, uri)
MediaUtils.getRealVideoPathFromURI(context.contentResolver, uri)
}
}

return uri.toString()
}

Expand Down
46 changes: 28 additions & 18 deletions mediapicker/src/main/java/vn/tungdx/mediapicker/MediaOptions.kt
Expand Up @@ -6,7 +6,6 @@ import android.os.Parcelable
import vn.tungdx.mediapicker.MediaOptions.Builder
import vn.tungdx.mediapicker.utils.MediaUtils
import java.io.File
import java.util.*

/**
* @author TUNGDX
Expand Down Expand Up @@ -42,31 +41,42 @@ class MediaOptions : Parcelable {
private var canSelectMultiVideo: Boolean = false
var isCropped: Boolean = false
private set

/**
*
* @return in milliseconds.
*/
var maxVideoDuration: Int = 0
private set

/**
*
* @return in milliseconds.
*/
var minVideoDuration: Int = 0
private set

private var canSelectPhoto: Boolean = false

private var canSelectVideo: Boolean = false

var photoFile: File? = null
private set

var aspectX: Int = 0
private set

var aspectY: Int = 0
private set

var isFixAspectRatio: Boolean = false
private set

var croppedFile: File? = null
private set
var mediaListSelected: List<MediaItem>? = ArrayList()

var mediaListSelected: List<MediaItem>? = null

var isShowWarningVideoDuration: Boolean = false
private set

Expand Down Expand Up @@ -149,7 +159,7 @@ class MediaOptions : Parcelable {
* @param mediaSelecteds
* Media list selected before.
*/
fun setMediaListSelected(mediaSelecteds: List<MediaItem>): Builder {
fun setMediaListSelected(mediaSelecteds: List<MediaItem>?): Builder {
this.mediaListSelected = mediaSelecteds
return this
}
Expand Down Expand Up @@ -368,21 +378,21 @@ class MediaOptions : Parcelable {
dest.writeTypedList(mediaListSelected)
}

constructor(`in`: Parcel) {
canSelectMultiPhoto = `in`.readInt() != 0
canSelectMultiVideo = `in`.readInt() != 0
canSelectPhoto = `in`.readInt() != 0
canSelectVideo = `in`.readInt() != 0
isCropped = `in`.readInt() != 0
isFixAspectRatio = `in`.readInt() != 0
isShowWarningVideoDuration = `in`.readInt() != 0
this.maxVideoDuration = `in`.readInt()
this.minVideoDuration = `in`.readInt()
aspectX = `in`.readInt()
aspectY = `in`.readInt()
this.photoFile = `in`.readSerializable() as File?
this.croppedFile = `in`.readSerializable() as File?
`in`.readTypedList(this.mediaListSelected, MediaItem.CREATOR)
constructor(parcel: Parcel) {
canSelectMultiPhoto = parcel.readInt() != 0
canSelectMultiVideo = parcel.readInt() != 0
canSelectPhoto = parcel.readInt() != 0
canSelectVideo = parcel.readInt() != 0
isCropped = parcel.readInt() != 0
isFixAspectRatio = parcel.readInt() != 0
isShowWarningVideoDuration = parcel.readInt() != 0
this.maxVideoDuration = parcel.readInt()
this.minVideoDuration = parcel.readInt()
aspectX = parcel.readInt()
aspectY = parcel.readInt()
this.photoFile = parcel.readSerializable() as File?
this.croppedFile = parcel.readSerializable() as File?
parcel.readTypedList(this.mediaListSelected ?: listOf(), MediaItem.CREATOR)
}

override fun hashCode(): Int {
Expand Down
Expand Up @@ -28,6 +28,7 @@ import vn.tungdx.mediapicker.imageloader.MediaImageLoaderImpl
import vn.tungdx.mediapicker.utils.MediaUtils
import vn.tungdx.mediapicker.utils.MessageUtils
import vn.tungdx.mediapicker.utils.RecursiveFileObserver
import vn.tungdx.mediapicker.utils.Utils
import java.io.File
import java.io.IOException
import java.util.*
Expand Down Expand Up @@ -248,16 +249,15 @@ class MediaPickerActivity : AppCompatActivity(), MediaSelectedListener, CropList
var file: File? = mMediaOptions!!.photoFile
if (file == null) {
try {
file = MediaUtils.createDefaultImageFile()
file = MediaUtils.createDefaultImageFile(this)
} catch (e: IOException) {
e.printStackTrace()
}

}
if (file != null) {
mPhotoFileCapture = file
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(file))
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Utils.getUriForFile(this, file))
startActivityForResult(takePictureIntent, REQUEST_PHOTO_CAPTURE)
mFileObserverTask = FileObserverTask()
mFileObserverTask!!.execute()
Expand Down Expand Up @@ -425,8 +425,7 @@ class MediaPickerActivity : AppCompatActivity(), MediaSelectedListener, CropList
// not get duration by Uri after record video.(It's usually happen
// in HTC
// devices 2.3, maybe others)
duration = MediaUtils
.getDuration(applicationContext, videoUri)
duration = MediaUtils.getDuration(applicationContext, videoUri)
}
// accept delta about < 1000 milliseconds. (ex: 10769 is still accepted
// if limit is 10000)
Expand Down Expand Up @@ -540,7 +539,7 @@ class MediaPickerActivity : AppCompatActivity(), MediaSelectedListener, CropList
grantResults: IntArray) {
when (requestCode) {
REQUEST_CAMERA_PERMISSION -> {
if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (takePhotoPending) {
takePhoto()
} else if (takeVideoPending) {
Expand All @@ -553,17 +552,16 @@ class MediaPickerActivity : AppCompatActivity(), MediaSelectedListener, CropList
}
//pass permission result to fragments in this activity
val fragments = supportFragmentManager.fragments
if (fragments != null) {
for (fragment in fragments) {
fragment.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
for (fragment in fragments) {
fragment.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}

companion object {
private const val TAG = "MediaPickerActivity"

const val EXTRA_MEDIA_OPTIONS = "extra_media_options"

/**
* Intent extra included when return back data in
* [Activity.onActivityResult] of activity or fragment
Expand Down
26 changes: 13 additions & 13 deletions mediapicker/src/main/java/vn/tungdx/mediapicker/utils/MediaUtils.kt
Expand Up @@ -51,12 +51,11 @@ object MediaUtils {
* @throws IOException
*/
@Throws(IOException::class)
fun createDefaultImageFile(): File {
fun createDefaultImageFile(context: Context): File {
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss",
Locale.getDefault()).format(Date())
val imageFileName = "JPEG_$timeStamp.jpg"
val storageDir = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)!!
if (!storageDir.exists()) {
storageDir.mkdirs()
}
Expand Down Expand Up @@ -176,17 +175,18 @@ object MediaUtils {
fun getRealVideoPathFromURI(contentResolver: ContentResolver,
contentURI: Uri): String? {
val cursor = contentResolver.query(contentURI, null, null, null, null)
if (cursor == null)
return contentURI.path
else {
cursor.moveToFirst()
val idx = cursor.getColumnIndex(Video.VideoColumns.DATA)
try {
return cursor.getString(idx)
} catch (exception: Exception) {
return null
}
?: return contentURI.path

cursor.moveToFirst()

val idx = cursor.getColumnIndex(Video.VideoColumns.DATA)

return try {
val path = cursor.getString(idx)
cursor.close()
path
} catch (exception: Exception) {
null
}
}

Expand Down
12 changes: 8 additions & 4 deletions mediapicker/src/main/java/vn/tungdx/mediapicker/utils/Utils.kt
Expand Up @@ -3,15 +3,14 @@ package vn.tungdx.mediapicker.utils
import android.annotation.TargetApi
import android.app.Activity
import android.content.Context
import android.content.res.TypedArray
import android.net.Uri
import android.os.Build
import android.os.Environment

import androidx.core.content.FileProvider
import vn.tungdx.mediapicker.R
import java.io.File
import java.io.IOException

import vn.tungdx.mediapicker.R

/**
* Created by TungDX on 6/4/2015.
*/
Expand Down Expand Up @@ -72,4 +71,9 @@ object Utils {
val prefix = System.currentTimeMillis().toString()
return File.createTempFile(prefix, null, folder)
}

@JvmStatic
fun getUriForFile(context: Context, file: File): Uri {
return FileProvider.getUriForFile(context, context.applicationContext.packageName + ".provider", file)
}
}
5 changes: 4 additions & 1 deletion mediapicker/src/main/res/xml/file_paths.xml
Expand Up @@ -2,5 +2,8 @@
<paths>
<external-path
name="images"
path="Pictures"/>
path="Pictures" />
<external-files-path
name="external_images"
path="Pictures" />
</paths>

0 comments on commit 45a2a97

Please sign in to comment.