美文网首页
Android原生文件分享

Android原生文件分享

作者: WangSins | 来源:发表于2019-03-05 15:15 被阅读0次

    创建分享

    1. 创建Intent并指定Action为Intent.ACTION_SEND。
    val shareIntent = Intent(Intent.ACTION_SEND)
    
    1. 指定需要发送的内容和类型。
    //传输文件 采用流的方式
    intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(File(fileUrl))
    intent.type = "*/*"
    
    1. 发送隐式意图,打开系统分享选择器。
    context.startActivity(shareIntent)
    

    获取文件类型(MimeType)

    文件分享时一般都要设置好文件类型,默认指定类型为*/*,已默认类型进行分享时有些App不支持这种类型,会导致我们分享失败,最好的方式是预先根据文件路径设置好文件类型。

    常见文件的mimeType

    {".3gp", "video/3gpp"},  
    {".apk", "application/vnd.android.package-archive"},  
    {".asf", "video/x-ms-asf"},  
    {".avi", "video/x-msvideo"},  
    {".bin", "application/octet-stream"},  
    {".bmp", "image/bmp"},  
    {".c", "text/plain"},  
    {".class", "application/octet-stream"},  
    {".conf", "text/plain"},  
    {".cpp", "text/plain"},  
    {".doc", "application/msword"},  
    {".exe", "application/octet-stream"},  
    {".gif", "image/gif"},  
    {".gtar", "application/x-gtar"},  
    {".gz", "application/x-gzip"},  
    {".h", "text/plain"},  
    {".htm", "text/html"},  
    {".html", "text/html"},  
    {".jar", "application/java-archive"},  
    {".java", "text/plain"},  
    {".jpeg", "image/jpeg"},  
    {".jpg", "image/jpeg"},  
    {".js", "application/x-javascript"},  
    {".log", "text/plain"},  
    {".m3u", "audio/x-mpegurl"},  
    {".m4a", "audio/mp4a-latm"},  
    {".m4b", "audio/mp4a-latm"},  
    {".m4p", "audio/mp4a-latm"},  
    {".m4u", "video/vnd.mpegurl"},  
    {".m4v", "video/x-m4v"},  
    {".mov", "video/quicktime"},  
    {".mp2", "audio/x-mpeg"},  
    {".mp3", "audio/x-mpeg"},  
    {".mp4", "video/mp4"},  
    {".mpc", "application/vnd.mpohun.certificate"},  
    {".mpe", "video/mpeg"},  
    {".mpeg", "video/mpeg"},  
    {".mpg", "video/mpeg"},  
    {".mpg4", "video/mp4"},  
    {".mpga", "audio/mpeg"},  
    {".msg", "application/vnd.ms-outlook"},  
    {".ogg", "audio/ogg"},  
    {".pdf", "application/pdf"},  
    {".png", "image/png"},  
    {".pps", "application/vnd.ms-powerpoint"},  
    {".ppt", "application/vnd.ms-powerpoint"},  
    {".prop", "text/plain"},  
    {".rar", "application/x-rar-compressed"},  
    {".rc", "text/plain"},  
    {".rmvb", "audio/x-pn-realaudio"},  
    {".rtf", "application/rtf"},  
    {".sh", "text/plain"},  
    {".tar", "application/x-tar"},  
    {".tgz", "application/x-compressed"},  
    {".txt", "text/plain"},  
    {".wav", "audio/x-wav"},  
    {".wma", "audio/x-ms-wma"},  
    {".wmv", "audio/x-ms-wmv"},  
    {".wps", "application/vnd.ms-works"},  
    {".xml", "text/xml"},  
    {".xml", "text/plain"},  
    {".z", "application/x-compress"},  
    {".zip", "application/zip"},  
    {"", "*/*"}  
    

    方式一:通过 ContentResolver 查询 Android 系统提供的 ContentProvider 获取(方便但不稳定)

    当 targetSdkVersion >= 24 时,
    使用 Uri.fromFile(File file) 获取文件 URI 会报android.os.FileUriExposedException 异常

    1. 获取文件的 url
    val shareFile = File(shareFilePath)
    val fileUri = Uri.fromFile(shareFile)
    
    1. 获取系统的提供的 ContentResolver
    val contentResolver = context!!.contentResolver
    
    1. 获取文件MimeType,如 image/png
    val fileMimeType = contentResolver.getType(fileUri)
    
    1. 获取文件Type,如 txt
    val mime = MimeTypeMap.getSingleton()
    val fileType = mime.getExtensionFromMimeType(fileMimeType)
    

    方式二:解析文件信息,通过匹配识别判断:

    1. 识别文件后缀,根据后缀名来判断文件类型。
    2. 获取文件头信息,转成十六进制字符串后判断文件类型。
    object FileUtil {
        /**
         * 根据文件后缀回去MIME类型
         *
         * @param file file
         * @return string
         */
        public fun getMIMEType(file: File): String {
            var type = "*/*"
            val fName = file.name
    
            //获取后缀名前的分隔符"."在fName中的位置。
            val dotIndex = fName.lastIndexOf(".")
            if (dotIndex < 0) {
                return type
            }
    
            /* 获取文件的后缀名*/
            val end = fName.substring(dotIndex, fName.length).toLowerCase()
            if (TextUtils.isEmpty(end)) {
                return type
            }
    
            //在MIME和文件类型的匹配表中找到对应的MIME类型。
            for (i in MIME_MapTable.indices) {
                if (end == MIME_MapTable[i][0]) {
                    type = MIME_MapTable[i][1]
                    break
                }
            }
            return type
        }
    
        private val MIME_MapTable = arrayOf(
                // {后缀名,MIME类型}
                arrayOf(".3gp", "video/3gpp"),
                arrayOf(".apk", "application/vnd.android.package-archive"),
                arrayOf(".asf", "video/x-ms-asf"),
                arrayOf(".avi", "video/x-msvideo"),
                arrayOf(".bin", "application/octet-stream"),
                arrayOf(".bmp", "image/bmp"),
                arrayOf(".c", "text/plain"),
                arrayOf(".class", "application/octet-stream"),
                arrayOf(".conf", "text/plain"),
                arrayOf(".cpp", "text/plain"),
                arrayOf(".doc", "application/msword"),
                arrayOf(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"),
                arrayOf(".xls", "application/vnd.ms-excel"),
                arrayOf(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
                arrayOf(".exe", "application/octet-stream"),
                arrayOf(".gif", "image/gif"),
                arrayOf(".gtar", "application/x-gtar"),
                arrayOf(".gz", "application/x-gzip"),
                arrayOf(".h", "text/plain"),
                arrayOf(".htm", "text/html"),
                arrayOf(".html", "text/html"),
                arrayOf(".jar", "application/java-archive"),
                arrayOf(".java", "text/plain"),
                arrayOf(".jpeg", "image/jpeg"),
                arrayOf(".jpg", "image/jpeg"), arrayOf(".js", "application/x-javascript"), arrayOf(".log", "text/plain"),
                arrayOf(".m3u", "audio/x-mpegurl"), arrayOf(".m4a", "audio/mp4a-latm"), arrayOf(".m4b", "audio/mp4a-latm"),
                arrayOf(".m4p", "audio/mp4a-latm"), arrayOf(".m4u", "video/vnd.mpegurl"), arrayOf(".m4v", "video/x-m4v"), arrayOf(".mov", "video/quicktime"),
                arrayOf(".mp2", "audio/x-mpeg"), arrayOf(".mp3", "audio/x-mpeg"), arrayOf(".mp4", "video/mp4"),
                arrayOf(".mpc", "application/vnd.mpohun.certificate"), arrayOf(".mpe", "video/mpeg"), arrayOf(".mpeg", "video/mpeg"),
                arrayOf(".mpg", "video/mpeg"), arrayOf(".mpg4", "video/mp4"), arrayOf(".mpga", "audio/mpeg"), arrayOf(".msg", "application/vnd.ms-outlook"),
                arrayOf(".ogg", "audio/ogg"),
                arrayOf(".pdf", "application/pdf"), arrayOf(".png", "image/png"), arrayOf(".pps", "application/vnd.ms-powerpoint"),
                arrayOf(".ppt", "application/vnd.ms-powerpoint"), arrayOf(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"),
                arrayOf(".prop", "text/plain"),
                arrayOf(".rc", "text/plain"), arrayOf(".rmvb", "audio/x-pn-realaudio"), arrayOf(".rtf", "application/rtf"),
                arrayOf(".sh", "text/plain"),
                arrayOf(".tar", "application/x-tar"), arrayOf(".tgz", "application/x-compressed"), arrayOf(".txt", "text/plain"),
                arrayOf(".wav", "audio/x-wav"),
                arrayOf(".wma", "audio/x-ms-wma"), arrayOf(".wmv", "audio/x-ms-wmv"), arrayOf(".wps", "application/vnd.ms-works"),
                arrayOf(".xml", "text/plain"), arrayOf(".z", "application/x-compress"), arrayOf(".zip", "application/x-zip-compressed"), arrayOf("", "*/*"))
    }
    

    相关文章

      网友评论

          本文标题:Android原生文件分享

          本文链接:https://www.haomeiwen.com/subject/fzfouqtx.html