d

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore.

15 St Margarets, NY 10033
(+381) 11 123 4567
ouroffice@aware.com

 

KMF

Android’s 10 and 11 Scoped Storage

fun getRealPathFromURI(context: Context, uri: Uri): String 

      val isKitKat: Boolean = 

           Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT

if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) 

       if (isGoogleDriveUri(uri))

           return getDriveFilePath(context, uri)

       else if (isExternalStorageDocument(uri)) 

            val docId: String = DocumentsContract.getDocumentId(uri)

            val split: List<String> = docId.split(":")

            val type: String = split[0]             

           if ("primary".equals(type, ignoreCase = true)) 

               if (split.size > 1) 

                 return context.getExternalFilesDir(null).toString()

                           + "https://dzone.com/" + split[1]

               else 

                  return context.getExternalFilesDir(null).

                                           toString() + "https://dzone.com/"

                return "storage" + "https://dzone.com/" + docId.replace(":", "https://dzone.com/")

            }        } else if (isDownloadsDocument(uri)) 

          context.contentResolver.openFileDescriptor(uri, "r", null)          parcelFileDescriptor?.let 

             val inputStream = FileInputStream(

                          parcelFileDescriptor.fileDescriptor)

             val file = File(

                      context.cacheDir, 

                      context.contentResolver.getFileName(uri))

             val outputStream = FileOutputStream(file)

             IOUtils.copyStream(inputStream, outputStream)

             return file.path

         }         

         else if (isMediaDocument(uri)) 

            val docId: String =DocumentsContract.getDocumentId(uri)

            val split: List<String> = docId.split(":")

            val type: String = split[0]

            return copyFileToInternalStorage(context,uri,"app name")

        else if ("content".equals(uri.scheme, ignoreCase = true)) 

            return if (isGooglePhotosUri(uri)) uri.lastPathSegment!!   

                    else copyFileToInternalStorage(

                           context,

                            uri,

                            "your app name")

        else if ("file".equals(uri.scheme, ignoreCase = true)) {

            return uri.path!!

   fun ContentResolver.getFileName(fileUri: Uri): String 

      val returnCursor = this.query(fileUri, null, null, null, null)

      if (returnCursor != null) {

         val nameIndex =returnCursor.getColumnIndex(

                          OpenableColumns.DISPLAY_NAME)

         returnCursor.moveToFirst()

         name = returnCursor.getString(nameIndex)

          returnCursor.close()

       return URLEncoder.encode(name, "utf-8")

    fun isExternalStorageDocument(uri: Uri): Boolean {

        return "com.android.externalstorage.documents".

                                equals(uri.authority)

    fun isGoogleDriveUri(uri: Uri): Boolean {

        return "com.google.android.apps.docs.storage".

                 equals(uri.authority) 

             || "com.google.android.apps.docs.storage.legacy".

                 equals(uri.authority)

    fun isDownloadsDocument(uri: Uri): Boolean {

        return "com.android.providers.downloads.documents"

                .equals(uri.authority)

    fun isMediaDocument(uri: Uri): Boolean {

        return "com.android.providers.media.documents"

               .equals(uri.authority)

    fun isGooglePhotosUri(uri: Uri): Boolean {

        return "com.google.android.apps.photos.content"

                .equals(uri.authority)

    fun getDriveFilePath(context: Context, uri: Uri): String 

        val returnUri = uri

        val returnCursor: Cursor? = context.contentResolver.query

                            (returnUri, null, null, null, null)

        val nameIndex: Int = returnCursor!!.getColumnIndex

                             (OpenableColumns.DISPLAY_NAME)

        val sizeIndex: Int = returnCursor.getColumnIndex

                                       (OpenableColumns.SIZE)        

        returnCursor.moveToFirst()        val name: String = (returnCursor.getString(nameIndex))

        val size = Long.toString(returnCursor.getLong(sizeIndex))

        val file = File(context.cacheDir, 

                 URLEncoder.encode(name, "utf-8"))        try {

            val inputStream: InputStream? = context.contentResolver.openInputStream(uri)

            val outputStream = FileOutputStream(file)            val read: Int = 0

            val maxBufferSize: Int = 1 * 1024 * 1024

            val bytesAvailable: Int = inputStream!!.available()

            val bufferSize: Int =

                       Math.min(bytesAvailable, maxBufferSize)

            val buffers = ByteArray(bufferSize)            inputStream.use { inputStream: InputStream ->

                outputStream.use { fileOut ->

                    while (true) {

                        val length = inputStream.read(buffers)

                        if (length <= 0)

                            break

                        fileOut.write(buffers, 0, length)

                    }

                    fileOut.flush()

                    fileOut.close()

            Log.e("File Size", "Size " + file.length())

            inputStream.close()            Log.e("File Path", "Path " + file.path)

            Log.e("File Size", "Size " + file.length())

        } catch (e: Exception) {

            Log.e("Exception", e.message.toString())

        return file.path

private fun copyFileToInternalStorage(mContext: Context, uri: Uri, newDirName: String): String 

    val returnCursor: Cursor? = mContext.contentResolver.query(

                               uri,

                              arrayOf(OpenableColumns.DISPLAY_NAME,         

                              OpenableColumns.SIZE),

                              null,

                              null,

                              null)

       val nameIndex = returnCursor!!.getColumnIndex

                       (OpenableColumns.DISPLAY_NAME)

       val sizeIndex = returnCursor.getColumnIndex

                       (OpenableColumns.SIZE)        returnCursor.moveToFirst()        val name = returnCursor.getString(nameIndex)

        val size = java.lang.Long.toString

                (returnCursor.getLong(sizeIndex))        val output: File

        if (newDirName != "") 

           val dir =File(mContext.filesDir.toString() 

                    + "https://dzone.com/" + newDirName)

           if (!dir.exists()) 

                dir.mkdir()

           output = File(

                mContext.filesDir.toString() 

                + "https://dzone.com/" + newDirName + "https://dzone.com/" 

                + URLEncoder.encode(name,"utf-8"))

            output = File(mContext.filesDir.toString() 

                     + "https://dzone.com/" + URLEncoder.encode(name, "utf-8"))

         val inputStream: InputStream?= 

               mContext.contentResolver.openInputStream(uri)

         val outputStream = FileOutputStream(output)

         val bufferSize = 1024

         val buffers = ByteArray(bufferSize)        while (inputStream!!.read(buffers).also { read = it} != -1){

                outputStream.write(buffers, 0, read)

        }        inputStream.close()

        outputStream.close()

     } catch (e: java.lang.Exception) {

            Log.e("Exception", e.message!!)

Credit: Source link

Previous Next
Close
Test Caption
Test Description goes like this