美文网首页
android 微信分享文件

android 微信分享文件

作者: proud2008 | 来源:发表于2020-08-26 13:04 被阅读0次
       <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="${applicationId}.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_provider_paths" />
            </provider>
    

    file_provider_paths.xml

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <!--内置SD卡 Environment.getExternalStorageDirectory() .表示共享所有的目录,也可以指定共享的目录-->
        <external-path
            name="external-path"
            path="."/>
        <!--内置SD卡 Context.getExternalCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
        <external-cache-path
            name="external-cache-path"
            path="."/>
        <!--内置SD卡 Context.getExternalFilesDir(null) .表示共享所有的目录,也可以指定共享的目录-->
        <external-files-path
            name="external-files-path"
            path="."/>
        <!--data目录下 Context.getFilesDir() .表示共享所有的目录,也可以指定共享的目录-->
        <files-path
            name="files_path"
            path="."/>
        <!--data缓存目录 Context.getCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
        <cache-path
            name="cache-path"
            path="."/>
        <!--这个标签Android官方文档中是没有提及,Android设备的根目录,该目录下包含着手机内部存储器,外置SD卡等所有文件的目录-->
        <root-path
            name="name"
            path="."/>
    
    </paths>
    
    package com.tencent;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Build;
    import android.util.Log;
    import android.widget.Toast;
    
    import androidx.core.content.FileProvider;
    
    import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
    import com.tencent.mm.opensdk.modelmsg.WXFileObject;
    import com.tencent.mm.opensdk.openapi.IWXAPI;
    import com.tencent.mm.opensdk.openapi.WXAPIFactory;
    import com.tencent.qcloud.tim.uikit.TUIKit;
    import com.xin.libandroidpaysocial.share.Constant;
    import com.xin.libandroidpaysocial.share.ShareData;
    import com.xin.libandroidpaysocial.share.ShareUtils;
    
    import java.io.File;
    
    /**
     * https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Share_and_Favorites/Android.html
     * https://developers.weixin.qq.com/community/develop/doc/0004886026c1a8402d2a040ee5b401
     * 
     * 注意了: 在androidmainfest.xml app节点下添加    android:requestLegacyExternalStorage="true"
    否则分享的文件大小会是0
     */
    public class ShareFile {
        /**
         * context 是application 无法获得所属页面的activity
         *
         * @param context
         * @param f
         */
        public static void openFile(Context context, File f) {
    //        boolean b1 = opFileByContent(context, f);
    //        log("openFile() called with: opFileBy = [" + b1 + "]");
            boolean b = doShare(context, f);
            if (!b) {
                openFileByApp(context, f);
            }
        }
    
        private static boolean opFileByContent(Context context, File f) {
            try {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(f).toString());
                String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                f = f.getParentFile();
                //7.0以上需要
                if (Build.VERSION.SDK_INT >= 24) {
                    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".uikit.fileprovider", f);
                    intent.setDataAndType(uri, mimetype);
                } else {
                    intent.setDataAndType(Uri.fromFile(f), mimetype);
                }
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                context.startActivity(intent);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    
        /**
         * 先尝试用系统的方式打开,系统的方式未找到,调用微信分享
         *
         * @param context
         * @param f
         */
        private static boolean openFileByApp(Context context, File f) {
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(f).toString());
                String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                //7.0以上需要
                if (Build.VERSION.SDK_INT >= 24) {
                    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".uikit.fileprovider", f);
                    intent.setDataAndType(uri, mimetype);
                } else {
                    intent.setDataAndType(Uri.fromFile(f), mimetype);
                }
                context.startActivity(intent);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(context, "打开文件出错,无支持的应用", Toast.LENGTH_LONG).show();
                return false;
            }
        }
    
        private static boolean doShare(Context context, File f) {
            if (!(context instanceof Activity)) {
                /*不是activity*/
                return false;
            }
            if (!f.exists()) {
                log("文件不存在");
                Toast.makeText(context, "文件不存在", Toast.LENGTH_LONG).show();
                return false;
            }
            final IWXAPI api = WXAPIFactory.createWXAPI(context, Constant.WX_AppID);
            api.registerApp(Constant.WX_AppID);
            if (!api.isWXAppInstalled()) {
                /*未安装微信*/
                return false;
            }
            if(f.length()>10*1024*1024){
                Toast.makeText(context, "文件超过10M", Toast.LENGTH_LONG).show();
                return false;
            }
            log("doShare() called with:  f = [" + f.getAbsolutePath() + "]");
    //        f = new File(context.getFilesDir(), "6221bdc_v4.msgstore-shm");
            String filePath = null;
            if (checkVersionValid(context) && checkAndroidNotBelowN()) {
                // 要与`AndroidManifest.xml`里配置的`authorities`一致,假设你的应用包名为com.example.app
                Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", f);
                // 授权给微信访问路径  // 这里填微信包名
                context.grantUriPermission("com.tencent.mm", contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
                filePath = contentUri.toString();
            } else {
                filePath = f.getAbsolutePath();
            }
            try {
                Activity activity = (Activity) context;
                ShareData shareData = new ShareData();
                WXFileObject wxMiniProgramObject = new WXFileObject();
                wxMiniProgramObject.setFilePath(filePath);
                shareData.setWxMiniProgramObject(wxMiniProgramObject);
                shareData.setShare_title(f.getName());
                shareData.setShare_desc(f.getName());
                ShareUtils.wx(activity, shareData, SendMessageToWX.Req.WXSceneSession,
                        new ShareUtils.ShareCallBack() {
                            @Override
                            public void onComplete() {
                                log("onComplete() called");
                            }
    
                            @Override
                            public void onError() {
                                log("onError() called");
                            }
    
                            @Override
                            public void onCancel() {
                                log("onCancel() called");
                            }
                        });
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    
        private static void log(String s) {
            Log.d("ShareFile", s);
        }
    
        // 判断微信版本是否为7.0.13及以上
        private static boolean checkVersionValid(Context context) {
            IWXAPI api = WXAPIFactory.createWXAPI(context, Constant.WX_AppID);
            return api.getWXAppSupportAPI() >= 0x27000D00;
        }
    
        // 判断Android版本是否7.0及以上
        private static boolean checkAndroidNotBelowN() {
            return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:android 微信分享文件

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