调用系统原生的文件分享功能将文件分享给QQ或微信好友

核心代码:

//传入的fileName是文件名的全路径
    @SuppressLint("QueryPermissionsNeeded")
    private void shareFile(String fileName) {
        final Uri uri;
        final File file = new File(fileName); 
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion >= 24) {//若SDK大于等于24  获取uri采用共享文件模式
//            Log.e(TAG, "版本大于24,获取uri采用共享文件模式, 根目录:" +  Environment.getExternalStorageDirectory().getPath());
            uri = FileProvider.getUriForFile(this.getApplicationContext(), "你的包名.fileprovider", file);
        } else {
            uri = Uri.fromFile(file);
        }

        Intent share = new Intent(Intent.ACTION_SEND);
        share.putExtra(Intent.EXTRA_STREAM, uri);
        share.setType(/*"application/pdf"*/getMIMEType(new File(file.getAbsolutePath())));//此处可发送多种文件
        share.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        share.addCategory(Intent.CATEGORY_DEFAULT);
        share.setPackage("com.tencent.mobileqq");
//若需要分享到微信,只需要更改Package即可
//share.setPackage("com.tencent.mm")
        if (share.resolveActivity(RowDataDirListActivity.this.getPackageManager()) != null)
        {
            RowDataDirListActivity.this.startActivity(share);
        } else {
            ToastUtils.show("没有可以处理该pdf文件的应用");
        }
    }

getMIMEType()方法:

    private String getMIMEType(File file) {
        String type="*/*";
        String fName = file.getName();
        //获取后缀名前的分隔符"."在fName中的位置。
        int dotIndex = fName.lastIndexOf(".");
        if(dotIndex < 0)
            return type;
        /* 获取文件的后缀名 */
        String fileType = fName.substring(dotIndex,fName.length()).toLowerCase();
        if("".equals(fileType))
            return type;
        //在MIME和文件类型的匹配表中找到对应的MIME类型。
        for(int i = 0; i< FileUtils.MIME_MapTable.length; i++){
            if(fileType.equals(FileUtils.MIME_MapTable[i][0]))
                type = FileUtils.MIME_MapTable[i][1];
        }
        return type;
    }

需要在AndroidManifest.xml中添加配置

    <application
		...
        <provider
            android:authorities="你的包名.fileprovider"
            android:name="androidx.core.content.FileProvider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths"/>
        </provider>
		...
    </application>

在res文件夹里创建一个xml文件夹, 并创建filepaths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="你需要访问的文件夹去掉根目录/" name="files_path" />
</paths>

external-path 就代表了 Environment.getExternalStorageDirectory().getPath()。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐