From 22b607f89c8ad18fd178628f7cdacf398b76a068 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Fri, 30 Apr 2021 23:04:37 +0800 Subject: [PATCH] Extract class to file --- .../com/nkming/nc_photos/MainActivity.kt | 97 ---------------- .../nc_photos/MediaStoreChannelHandler.kt | 107 ++++++++++++++++++ 2 files changed, 107 insertions(+), 97 deletions(-) create mode 100644 android/app/src/main/kotlin/com/nkming/nc_photos/MediaStoreChannelHandler.kt diff --git a/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt b/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt index caff3cde..bb2c5b1a 100644 --- a/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt +++ b/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt @@ -1,25 +1,9 @@ package com.nkming.nc_photos -import android.Manifest -import android.app.Activity -import android.content.ContentValues -import android.content.pm.PackageManager -import android.os.Build -import android.os.Environment -import android.provider.MediaStore import androidx.annotation.NonNull -import androidx.annotation.RequiresApi -import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -import java.io.BufferedOutputStream -import java.io.File -import java.io.FileOutputStream - -private const val PERMISSION_REQUEST_CODE = 11011 class MainActivity: FlutterActivity() { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { @@ -29,84 +13,3 @@ class MainActivity: FlutterActivity() { .setMethodCallHandler(MediaStoreChannelHandler(this)) } } - -class MediaStoreChannelHandler(activity: Activity) - : MethodChannel.MethodCallHandler { - companion object { - @JvmStatic - val CHANNEL = "com.nkming.nc_photos/media_store" - } - - override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { - if (call.method == "saveFileToDownload") { - saveFileToDownload(call.argument("fileName")!!, - call.argument("content")!!, result) - } else { - result.notImplemented() - } - } - - private fun saveFileToDownload(fileName: String, content: ByteArray, - result: MethodChannel.Result) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - saveFileToDownload29(fileName, content, result) - } else { - saveFileToDownload0(fileName, content, result) - } - } - - @RequiresApi(Build.VERSION_CODES.Q) - private fun saveFileToDownload29(fileName: String, content: ByteArray, - result: MethodChannel.Result) { - // Add a media item that other apps shouldn't see until the item is - // fully written to the media store. - val resolver = _context.applicationContext.contentResolver - - // Find all audio files on the primary external storage device. - val collection = MediaStore.Downloads.getContentUri( - MediaStore.VOLUME_EXTERNAL_PRIMARY) - val details = ContentValues().apply { - put(MediaStore.Downloads.DISPLAY_NAME, fileName) - } - - val contentUri = resolver.insert(collection, details) - - resolver.openFileDescriptor(contentUri!!, "w", null).use { pfd -> - // Write data into the pending audio file. - BufferedOutputStream(FileOutputStream(pfd!!.fileDescriptor)).use { - stream -> stream.write(content) - } - } - result.success(null) - } - - private fun saveFileToDownload0(fileName: String, content: ByteArray, - result: MethodChannel.Result) { - if (ContextCompat.checkSelfPermission(_activity, - Manifest.permission.WRITE_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(_activity, - arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), - PERMISSION_REQUEST_CODE) - result.error("permissionError", "Permission not granted", null) - return - } - - val path = Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_DOWNLOADS) - var file = File(path, fileName) - var count = 1 - while (file.exists()) { - val f = File(fileName) - file = File(path, "${f.nameWithoutExtension} ($count).${f.extension}") - ++count - } - BufferedOutputStream(FileOutputStream(file)).use { - stream -> stream.write(content) - } - result.success(null) - } - - private val _activity = activity - private val _context get() = _activity -} diff --git a/android/app/src/main/kotlin/com/nkming/nc_photos/MediaStoreChannelHandler.kt b/android/app/src/main/kotlin/com/nkming/nc_photos/MediaStoreChannelHandler.kt new file mode 100644 index 00000000..f5710318 --- /dev/null +++ b/android/app/src/main/kotlin/com/nkming/nc_photos/MediaStoreChannelHandler.kt @@ -0,0 +1,107 @@ +package com.nkming.nc_photos + +import android.Manifest +import android.app.Activity +import android.content.ContentValues +import android.content.pm.PackageManager +import android.os.Build +import android.os.Environment +import android.provider.MediaStore +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileOutputStream + +private const val PERMISSION_REQUEST_CODE = 11011 + +/* + * Save downloaded item on device + * + * Methods: + * Write binary content to a file in the Download directory + * fun saveFileToDownload(fileName: String, content: ByteArray) + */ +class MediaStoreChannelHandler(activity: Activity) + : MethodChannel.MethodCallHandler { + companion object { + @JvmStatic + val CHANNEL = "com.nkming.nc_photos/media_store" + } + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + if (call.method == "saveFileToDownload") { + saveFileToDownload(call.argument("fileName")!!, + call.argument("content")!!, result) + } else { + result.notImplemented() + } + } + + private fun saveFileToDownload(fileName: String, content: ByteArray, + result: MethodChannel.Result) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + saveFileToDownload29(fileName, content, result) + } else { + saveFileToDownload0(fileName, content, result) + } + } + + @RequiresApi(Build.VERSION_CODES.Q) + private fun saveFileToDownload29(fileName: String, content: ByteArray, + result: MethodChannel.Result) { + // Add a media item that other apps shouldn't see until the item is + // fully written to the media store. + val resolver = _context.applicationContext.contentResolver + + // Find all audio files on the primary external storage device. + val collection = MediaStore.Downloads.getContentUri( + MediaStore.VOLUME_EXTERNAL_PRIMARY) + val details = ContentValues().apply { + put(MediaStore.Downloads.DISPLAY_NAME, fileName) + } + + val contentUri = resolver.insert(collection, details) + + resolver.openFileDescriptor(contentUri!!, "w", null).use { pfd -> + // Write data into the pending audio file. + BufferedOutputStream(FileOutputStream(pfd!!.fileDescriptor)).use { + stream -> stream.write(content) + } + } + result.success(null) + } + + private fun saveFileToDownload0(fileName: String, content: ByteArray, + result: MethodChannel.Result) { + if (ContextCompat.checkSelfPermission(_activity, + Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(_activity, + arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), + PERMISSION_REQUEST_CODE) + result.error("permissionError", "Permission not granted", null) + return + } + + val path = Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_DOWNLOADS) + var file = File(path, fileName) + var count = 1 + while (file.exists()) { + val f = File(fileName) + file = File(path, "${f.nameWithoutExtension} ($count).${f.extension}") + ++count + } + BufferedOutputStream(FileOutputStream(file)).use { + stream -> stream.write(content) + } + result.success(null) + } + + private val _activity = activity + private val _context get() = _activity +}