前言
对Android ResultsApi的封装,学无止境,会随时间迭代,使用的必要依赖
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0'
implementation "androidx.activity:activity-ktx:1.2.0"
implementation "androidx.fragment:fragment-ktx:1.3.0"
复制代码
正文
object ResultsApi {
val CAMERA = "image/*"
val VIDEO = "video/*"
fun AppCompatActivity.initializeApi() {
resultActivityLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
activityResultData.postValue(it)
}
resultCameraLauncher =
registerForActivityResult(ActivityResultContracts.GetContent()) {
imageUrl.postValue(it)
}
resultTakePhotosLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) {
takePhotosUrl.postValue(it)
}
resultVideoLauncher =
registerForActivityResult(ActivityResultContracts.TakeVideo()) {
videoBitmap.postValue(it)
}
resultPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
getPermission.postValue(it)
}
resultPermissionsLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
getPermissions.postValue(it)
}
resultDocumentLauncher =
registerForActivityResult(ActivityResultContracts.OpenDocument()) {
documentUrl.postValue(it)
}
resultDocumentsLauncher =
registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) {
documentsUrl.postValue(it)
}
}
fun Fragment.initializeApi() {
resultActivityLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
activityResultData.postValue(it)
}
resultCameraLauncher =
registerForActivityResult(ActivityResultContracts.GetContent()) {
imageUrl.postValue(it)
}
resultTakePhotosLauncher =
registerForActivityResult(ActivityResultContracts.TakePicture()) {
takePhotosUrl.postValue(it)
}
resultVideoLauncher =
registerForActivityResult(ActivityResultContracts.TakeVideo()) {
videoBitmap.postValue(it)
}
resultPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
getPermission.postValue(it)
}
resultPermissionsLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
getPermissions.postValue(it)
}
resultDocumentLauncher =
registerForActivityResult(ActivityResultContracts.OpenDocument()) {
documentUrl.postValue(it)
}
resultDocumentsLauncher =
registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) {
documentsUrl.postValue(it)
}
}
private var resultActivityLauncher: ActivityResultLauncher<Intent>? = null
val activityResultData: MutableLiveData<ActivityResult> by lazy {
MutableLiveData<ActivityResult>()
}
fun AppCompatActivity.startActivity(intent: Intent,result:(ActivityResult)->Unit) {
activityResultData.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultActivityLauncher!!.launch(intent)
}
fun Fragment.startActivity(intent: Intent,result:(ActivityResult)->Unit) {
activityResultData.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultActivityLauncher!!.launch(intent)
}
private var resultCameraLauncher: ActivityResultLauncher<String>? = null
val imageUrl: MutableLiveData<Uri> by lazy {
MutableLiveData<Uri>()
}
fun AppCompatActivity.startCamera(type: String,permissionError:(()->Unit)? = null, result: (Uri) -> Unit,) {
startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
if(it) {
imageUrl.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultCameraLauncher!!.launch(type)
}else permissionError?.invoke()
}
}
fun Fragment.startCamera(type: String,permissionError:(()->Unit)? = null, result: (Uri) -> Unit,) {
startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
if(it) {
imageUrl.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultCameraLauncher!!.launch(type)
}else permissionError?.invoke()
}
}
private var resultTakePhotosLauncher: ActivityResultLauncher<Uri>? = null
val takePhotosUrl: MutableLiveData<Boolean> by lazy {
MutableLiveData<Boolean>()
}
fun AppCompatActivity.startTakePhotos(
context: Context,
authority: String,
file: File,
permissionError:(()->Unit)? = null,
result: (Uri, Boolean) -> Unit,
) {
startPermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
if (it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!! && it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!!){
val uri = FileProvider.getUriForFile(
context,
authority,
file)
takePhotosUrl.observe(this) {
preventRepeated {
result.invoke(uri, it)
}
}
resultTakePhotosLauncher!!.launch(uri)
} else permissionError?.invoke()
}
}
fun Fragment.startTakePhotos(
context: Context,
authority: String,
file: File,
permissionError:(()->Unit)? = null,
result: (Uri, Boolean) -> Unit,
) {
startPermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
if (it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!! && it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!!){
val uri = FileProvider.getUriForFile(
context,
authority,
file)
takePhotosUrl.observe(this) {
preventRepeated {
result.invoke(uri, it)
}
}
resultTakePhotosLauncher!!.launch(uri)
} else permissionError?.invoke()
}
}
private var resultVideoLauncher: ActivityResultLauncher<Uri>? = null
val videoBitmap: MutableLiveData<Bitmap> by lazy {
MutableLiveData<Bitmap>()
}
fun AppCompatActivity.startVideo(
context: Context,
authority: String,
file: File,
videoUrl: (Uri, Bitmap) -> Unit,
) {
val uri = FileProvider.getUriForFile(
context,
authority,
file)
videoBitmap.observe(this) {
preventRepeated {
videoUrl.invoke(uri, it)
}
}
resultVideoLauncher!!.launch(uri)
}
fun Fragment.startVideo(
context: Context,
authority: String,
file: File,
videoUrl: (Uri, Bitmap) -> Unit,
) {
val uri = FileProvider.getUriForFile(
context,
authority,
file)
videoBitmap.observe(this) {
preventRepeated {
videoUrl.invoke(uri, it)
}
}
resultVideoLauncher!!.launch(uri)
}
private var resultPermissionLauncher: ActivityResultLauncher<String>? = null
val getPermission: MutableLiveData<Boolean> by lazy {
MutableLiveData<Boolean>()
}
fun AppCompatActivity.startPermission(permission: String, havePermission: (Boolean) -> Unit) {
getPermission.observe(this) {
preventRepeated {
havePermission.invoke(it)
}
}
resultPermissionLauncher!!.launch(permission)
}
fun Fragment.startPermission(permission: String, havePermission: (Boolean) -> Unit) {
getPermission.observe(this) {
preventRepeated {
havePermission.invoke(it)
}
}
resultPermissionLauncher!!.launch(permission)
}
private var resultPermissionsLauncher: ActivityResultLauncher<Array<String>>? = null
val getPermissions: MutableLiveData<MutableMap<String, Boolean>> by lazy {
MutableLiveData<MutableMap<String, Boolean>>()
}
fun AppCompatActivity.startPermissions(
permission: Array<String>,
havePermission: (MutableMap<String, Boolean>) -> Unit,
) {
getPermissions.observe(this) {
preventRepeated {
havePermission.invoke(it)
}
}
resultPermissionsLauncher!!.launch(permission)
}
fun Fragment.startPermissions(
permission: Array<String>,
havePermission: (MutableMap<String, Boolean>) -> Unit,
) {
getPermissions.observe(this) {
preventRepeated {
havePermission.invoke(it)
}
}
resultPermissionsLauncher!!.launch(permission)
}
private var resultDocumentLauncher: ActivityResultLauncher<Array<String>>? = null
val documentUrl: MutableLiveData<Uri> by lazy {
MutableLiveData<Uri>()
}
fun AppCompatActivity.startDocument(type: Array<String>, permissionError:(()->Unit)? = null,
result: (Uri) -> Unit,) {
startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
if (it){
documentUrl.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultDocumentLauncher!!.launch(type)
}else permissionError?.invoke()
}
}
fun Fragment.startDocument(type: Array<String>, permissionError:(()->Unit)? = null,
result: (Uri) -> Unit,) {
startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
if (it){
documentUrl.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultDocumentLauncher!!.launch(type)
}else permissionError?.invoke()
}
}
private var resultDocumentsLauncher: ActivityResultLauncher<Array<String>>? = null
val documentsUrl: MutableLiveData<MutableList<Uri>> by lazy {
MutableLiveData<MutableList<Uri>>()
}
fun AppCompatActivity.startDocuments(type: Array<String>, permissionError:(()->Unit)? = null,
result: (MutableList<Uri>) -> Unit,) {
startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
if (it){
documentsUrl.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultDocumentsLauncher!!.launch(type)
}else permissionError?.invoke()
}
}
fun Fragment.startDocuments(type: Array<String>, permissionError:(()->Unit)? = null,
result: (MutableList<Uri>) -> Unit,) {
startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
if (it){
documentsUrl.observe(this){
preventRepeated {
result.invoke(it)
}
}
resultDocumentsLauncher!!.launch(type)
}else permissionError?.invoke()
}
}
private var lastClickTime: Long = 0
fun preventRepeated(click: () -> Unit) {
val time = System.currentTimeMillis()
val longTime = time - lastClickTime
if (0 < longTime && longTime > 500) {
click.invoke()
}
lastClickTime = time
}
}
复制代码