|
@@ -5,6 +5,8 @@ import android.content.Intent
|
|
import android.net.Uri
|
|
import android.net.Uri
|
|
import com.kdanmobile.reader.utils.UriToPathUtil
|
|
import com.kdanmobile.reader.utils.UriToPathUtil
|
|
import java.io.File
|
|
import java.io.File
|
|
|
|
+import java.io.FileNotFoundException
|
|
|
|
+import java.net.URLEncoder
|
|
import java.util.regex.Pattern
|
|
import java.util.regex.Pattern
|
|
|
|
|
|
class CopyFileInfoFactory {
|
|
class CopyFileInfoFactory {
|
|
@@ -16,7 +18,7 @@ class CopyFileInfoFactory {
|
|
} else {
|
|
} else {
|
|
intent.getStringExtra(CopyFileActivity.KEY_FILE_ABSOLUTE_PATH)
|
|
intent.getStringExtra(CopyFileActivity.KEY_FILE_ABSOLUTE_PATH)
|
|
}
|
|
}
|
|
- val uri = intent.data
|
|
|
|
|
|
+ val uri = getUriFromIntent(applicationContext, intent)
|
|
return CopyFileInfo(shouldCopyFile, isActionView, srcFilePath, uri)
|
|
return CopyFileInfo(shouldCopyFile, isActionView, srcFilePath, uri)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -41,4 +43,39 @@ class CopyFileInfoFactory {
|
|
}
|
|
}
|
|
return if (null != filePath && File(filePath).exists()) filePath else null
|
|
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
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|