Преглед изворни кода

Merge branch 'fixCopyFileInfoUri' into 'master'

修正CopyFileInfo的Uri錯誤

See merge request kdanandroid/pdf/pdfreaderreadermodule!41
Wayne Huang пре 5 година
родитељ
комит
253b211dc7
1 измењених фајлова са 38 додато и 1 уклоњено
  1. 38 1
      src/main/java/com/kdanmobile/reader/copyfile/CopyFileInfoFactory.kt

+ 38 - 1
src/main/java/com/kdanmobile/reader/copyfile/CopyFileInfoFactory.kt

@@ -5,6 +5,8 @@ import android.content.Intent
 import android.net.Uri
 import com.kdanmobile.reader.utils.UriToPathUtil
 import java.io.File
+import java.io.FileNotFoundException
+import java.net.URLEncoder
 import java.util.regex.Pattern
 
 class CopyFileInfoFactory {
@@ -16,7 +18,7 @@ class CopyFileInfoFactory {
         } else {
             intent.getStringExtra(CopyFileActivity.KEY_FILE_ABSOLUTE_PATH)
         }
-        val uri = intent.data
+        val uri = getUriFromIntent(applicationContext, intent)
         return CopyFileInfo(shouldCopyFile, isActionView, srcFilePath, uri)
     }
 
@@ -41,4 +43,39 @@ class CopyFileInfoFactory {
         }
         return if (null != filePath && File(filePath).exists()) filePath else null
     }
+
+    private fun getUriFromIntent(applicationContext: Context, intent: Intent): Uri? {
+        val uri = intent.data ?: return null
+        return if (isFileExist(applicationContext, uri)) {
+            uri
+        } else {
+            val prefix = "content://"
+            if (uri.toString().length < prefix.length) return uri
+            val path = uri.toString().substring(prefix.length)
+            if (path.isEmpty()) return uri
+            val split = path.split("/")
+            val builder = StringBuilder()
+            builder.append(prefix)
+            for (str in split) {
+                builder.append(URLEncoder.encode(str, "UTF-8"))
+                builder.append("/")
+            }
+            val fileUri = Uri.parse(builder.deleteCharAt(builder.length - 1).toString())
+            if (isFileExist(applicationContext, fileUri)) {
+                fileUri
+            } else {
+                uri
+            }
+        }
+    }
+
+    private fun isFileExist(applicationContext: Context, fileUri: Uri): Boolean {
+        return try {
+            val assetFileDescriptor = applicationContext.contentResolver.openAssetFileDescriptor(fileUri, "r")
+            assetFileDescriptor?.close()
+            true
+        } catch (e: FileNotFoundException) {
+            false
+        }
+    }
 }