android 實現微信分享

微信分享有2種方式:

  1. 集成微信分享SDK實現分享功能
  2. 調用系統原生的分享實現分享功能

集成微信分享SDK實現分享功能

微信開放平臺

需要先註冊開發這賬號

創建應用
在這裏插入圖片描述

創建應用注意事項

  1. 應用官網:可以隨便寫個正確格式的url。
    應用官網
  2. 上傳移動應用圖片大小要符合要求。
    在這裏插入圖片描述
  3. 應用簽名。
    在這裏插入圖片描述
    把帶簽名 的apk文件安裝至手機中。安裝微信的簽名生成工具,打開GenSignature應用程序,填寫你App的包名,點擊“Get Signature”即可得到簽名。

點擊下載 簽名生成工具

在這裏插入圖片描述

在這裏插入圖片描述

Android接入指南

官方文檔

1.申請你的 AppID

請到 開發者應用登記頁面 進行登記,登記並選擇移動應用進行設置後,將該應用提交審覈,只有審覈通過的應用才能進行開發。

2. 添加依賴

在app模塊的build.gradle文件中

dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

(從5.4.3版本開始,wechat-sdk-android-with-mta不再維護)

3.搭建開發環境

Android Studio 環境下:

在 Android Studio 中新建你的工程,並保證網絡設置可以成功從 jcenter 下載微信 SDK 即可。

4. 添加權限

添加必要的權限支持(其中網絡權限如果沒有使用掃碼登錄功能非必要;後三個權限,如果沒有使用 mta,也非必要,即使有使用 mta,去掉也不影響功能):

<uses-permission android:name="android.permission.INTERNET" />

<!-- for mta statistics, not necessary-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

5. 註冊到微信

要使你的程序啓動後微信終端能響應你的程序,必須在代碼中向微信終端註冊你的 id。(可以在程序入口 Activity 的 onCreate 回調函數處,或其他合適的地方將你的應用 id 註冊到微信。

public class ShareApplication extends Application {

    private static final String APP_ID = "wx88888888";

    // IWXAPI 是第三方app和微信通信的openApi接口
    private IWXAPI api;

    @Override
    public void onCreate() {
        super.onCreate();

        // 通過WXAPIFactory工廠,獲取IWXAPI的實例
        // 三個參數分別是上下文、應用的appId、是否檢查簽名(默認爲false)
        api = WXAPIFactory.createWXAPI(this, APP_ID, true);

        // 將應用的appId註冊到微信
        api.registerApp(APP_ID);


        //建議動態監聽微信啓動廣播進行註冊到微信
       /* registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                // 將該app註冊到微信
                api.registerApp(APP_ID);
            }
        }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));*/
    }
}

混淆代碼

如果需要混淆代碼,爲了保證 sdk 的正常使用,需要在 proguard.cfg 加上下面兩行配置:

-keep class com.tencent.mm.opensdk.** {
    *;
}

-keep class com.tencent.wxop.** {
    *;
}

-keep class com.tencent.mm.sdk.** {
    *;
}

獲取分享到微信的回調

如果你的程序需要接收微信發送的請求,或者接收發送到微信請求的響應結果,需要下面 操作:

在你的包名相應目錄下新建一個 wxapi 目錄,並在該 wxapi 目錄下新增一個 WXEntryActivity 類,該類繼承自 Activity
在這裏插入圖片描述
並在 manifest 文件裏面加上 exported 屬性,設置爲 true,例如:


        <!--微信分享-->
        <activity
            android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>

WXEntryActivity

實現 IWXAPIEventHandler 接口,微信發送的請求將回調到 onReq 方法,發送到微信請求的響應結果將回調到 onResp 方法。

在 WXEntryActivity 中將接收到的 intent 及實現了 IWXAPIEventHandler 接口的對象傳遞給 IWXAPI 接口的 handleIntent 方法。

當微信發送請求到你的應用,將通過 IWXAPIEventHandler 接口的 onReq 方法進行回調,類似的,應用請求微信的響應結果將通過 onResp 回調。

/**
 * Cerated by xiaoyehai
 * Create date : 2019/11/15 17:31
 * description : 分享到微信和微信朋友圈的回調
 * <p>
 * SendMessageToWX.Req.WXSceneSession(0):是分享到好友會話
 * SendMessageToWX.Req.WXSceneTimeline(1):是分享到朋友圈
 * 微信 4.2 以上版本支持才支持分享到朋友圈
 */
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {

    //IWXAPI 是第三方app和微信通信的openApi接口
    private IWXAPI iwxapi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.activity_test);

        //如果沒回調onResp,八成是這句沒有寫
        iwxapi = WXAPIFactory.createWXAPI(this, Constants.WX_APP_ID, false);
        iwxapi.handleIntent(getIntent(), this);

    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        iwxapi.handleIntent(intent, this);
    }


    /**
     * 微信發送的請求將回調到 onReq 方法
     *
     * @param baseReq
     */
    @Override
    public void onReq(BaseReq baseReq) {
    }

    /**
     * 發送到微信請求的響應結果將回調到 onResp 方法
     *
     * @param resp
     */
    @Override
    public void onResp(BaseResp resp) {
        String result;
        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                result = "分享成功";
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                result = "取消分享";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                result = "分享被拒絕";
                break;
            default:
                result = "發送返回";
                break;
        }
        Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
        finish();
    }
}

WxShareHelper:封裝分享功能

該類只封裝了一些簡單的分享功能,如果需要分享其他類型的數據,請參考官方文檔

/**
 * Cerated by xiaoyehai
 * Create date : 2019/12/4 22:06
 * description :微信分享幫助類
 * <p>
 * 分享到對話:SendMessageToWX.Req.WXSceneSession
 * 分享到朋友圈:SendMessageToWX.Req.WXSceneTimeline
 */
public class WxShareHelper {

    //分享到微信
    public static final int WX_SCENE = SendMessageToWX.Req.WXSceneSession;
    //分享到朋友圈
    public static final int TIMELINE_SCENE = SendMessageToWX.Req.WXSceneSession;

    private static WxShareHelper mInstance = new WxShareHelper();

    private WxShareHelper() {
    }

    public static WxShareHelper getInstnce() {
        return mInstance;
    }

    /**
     * 判斷是否安裝微信
     *
     * @param context
     */
    private void checkInstallWx(Context context) {
        IWXAPI wxapi = WXAPIFactory.createWXAPI(context, Constants.WX_APP_ID);
        if (!wxapi.isWXAppInstalled()) {
            Toast.makeText(context, "對不起,您沒有安裝微信", Toast.LENGTH_SHORT).show();
            return;
        }
    }

    /**
     * 分享文本到微信
     *
     * @param context
     * @param scene
     */
    public void shareTextToWX(Context context, int scene) {

        checkInstallWx(context);

        // 通過appId得到IWXAPI這個對象
        IWXAPI wxapi = WXAPIFactory.createWXAPI(context, Constants.WX_APP_ID);

        //初始化一個 WXTextObject 對象,填寫分享的文本內容
        WXTextObject textObj = new WXTextObject();
        textObj.text = "我是分享到微信的數據";

        //用 WXTextObject 對象初始化一個 WXMediaMessage 對象
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = textObj;
        msg.description = "描述";

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        //req.transaction = String.valueOf(System.currentTimeMillis());  //transaction字段用與唯一標示一個請求
        req.transaction = buildTransaction("text");
        req.message = msg;
        req.scene = scene;
        //調用api接口,發送數據到微信
        wxapi.sendReq(req);
    }

    /**
     * 分享網頁類型至微信
     *
     * @param context 上下文
     * @param scene
     */
    public void shareWebToWX(Context context, int scene) {
        checkInstallWx(context);

        IWXAPI wxapi = WXAPIFactory.createWXAPI(context, Constants.WX_APP_ID);

        // 初始化一個WXWebpageObject對象
        WXWebpageObject webpageObject = new WXWebpageObject();
        // 填寫網頁的url
        webpageObject.webpageUrl = "https://www.baidu.com/";

        // 用WXWebpageObject對象初始化一個WXMediaMessage對象
        WXMediaMessage msg = new WXMediaMessage(webpageObject);
        // 填寫網頁標題、描述、位圖
        msg.title = "網頁標題";
        msg.description = "網頁描述";

        //這塊需要注意,圖片的像素千萬不要太大,不然的話會調不起來微信分享
        Bitmap thumbBmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.login_logo);
        // 如果沒有位圖,可以傳null,會顯示默認的圖片
        msg.setThumbImage(thumbBmp);

        // 構造一個Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        // transaction用於唯一標識一個請求(可自定義)
        req.transaction = buildTransaction("webpage");
        // 上文的WXMediaMessage對象
        req.message = msg;
        req.scene = scene;
        //req.userOpenId = getOpenId();

        // 向微信發送請求
        wxapi.sendReq(req);
    }

    /**
     * 分享圖片到微信,朋友圈
     *
     * @param context
     * @param scene
     */
    public void shareBitmapToWX(Context context, int scene) {
        checkInstallWx(context);

        // 通過appId得到IWXAPI這個對象
        IWXAPI wxapi = WXAPIFactory.createWXAPI(context, Constants.WX_APP_ID);
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.login_logo);

        //初始化 WXImageObject 和 WXMediaMessage 對象
        WXImageObject imgObj = new WXImageObject(bitmap);
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;

        //設置縮略圖
        Bitmap thumbBmp = Bitmap.createScaledBitmap(bitmap, 100, 100, true);
        bitmap.recycle();
        msg.thumbData = bmpToByteArray(thumbBmp, true);

        //構造一個Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("img");
        req.message = msg;
        req.scene = scene;
        //req.userOpenId = getOpenId();
        //調用api接口,發送數據到微信
        wxapi.sendReq(req);
    }

    /**
     * 用於解析圖片
     * 分享的圖片大小不能大於32KB,
     *
     * @param bmp
     * @param needRecycle
     * @return
     */
    public byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 生成transaction
     *
     * @param type
     * @return
     */
    private String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }
}

使用

//分享文本
WxShareHelper.getInstnce().shareTextToWX(mContext,WxShareHelper.WX_SCENE);
  
// 分享網頁    
WxShareHelper.getInstnce().shareWebToWX(mContext,WxShareHelper.WX_SCENE);
  //分享圖片 
WxShareHelper.getInstnce().shareBitmapToWX(mContext,WxShareHelper.WX_SCENE);

Android調用系統原生的分享實現分享功能

備註:
①.這個不用導入微信的jar和註冊微信的APP_ID 。
②. 實際上分享時是調用系統本地的分享功能,所以分享的圖片必須要保存到本地。
③. 保存到本地是耗時操作 分享的代碼需要在子線程執行 。

分享多張圖片

微信平臺沒有提供分享多張的SDK,我們只能自己調用系統自帶的分享功能實現。

在ShareHelper種加入下面代碼:

 private static final String WX_PACKAGE_NAME = "com.tencent.mm"; //微信包名
    private static final String SHARE_IMG_UI = "com.tencent.mm.ui.tools.ShareImgUI"; //分享到微信好友
    private static final String SHARE_TO_TIMELINE_UI = "com.tencent.mm.ui.tools.ShareToTimeLineUI"; //分享到微信朋友圈

    /**
     * 微信7.0版本號,兼容處理微信7.0版本分享到朋友圈不支持多圖片的問題
     */
    private static final int VERSION_CODE_FOR_WEI_XIN_VER7 = 1380;

    /**
     * Android調用系統分享的實現;分享單張圖片到微信
     *
     * @param context
     * @param imageFile
     */
    public void shareSingleImageToWX(Context context, File imageFile) {

        //判斷是否安裝微信,如果沒有安裝微信 又沒有判斷就直達微信分享是會掛掉的
        if (!Tools.isWeixinAvilible(mContext)) {
            Toast.makeText(context, "您還沒有安裝微信", Toast.LENGTH_SHORT).show();
            return;
        }

        Intent intent = new Intent();
        //發送圖片給好友
        ComponentName componentName = new ComponentName(WX_PACKAGE_NAME, SHARE_IMG_UI);
        intent.setComponent(componentName);
        intent.setAction(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
        context.startActivity(intent);
    }


    /**
     * Android調用系統分享的實現:分享多張圖片到微信,分享單張圖片也可以用該方法
     * <p>
     * 昨天公司老大通知客戶改需求了,原來的微信分享改成分享多張圖片,然後屁顛屁顛跑到微信平臺看了以後
     * 心裏千萬只草泥馬狂奔而過,微信平臺沒有提供分享多張的SDK有木有啊,我們只能自己調用系統自帶的分享功能實現。
     * <p>
     * 實際分享的時候因爲是調用系統本地的分享功能,所以分享的圖片也就必須要存到本地,不然就會提示獲取資源失敗,那就要把圖片存到本地了
     * 這個是直接調用微信的分享,所以調起分享的時候一定要判斷手機裏面是否已經安裝了微信,如果沒有安裝還要掉微信分享就是直接崩潰掉。
     *
     * @param context
     * @param imageFileList 保存到本地的圖片
     */
    public void shareMultiImageToWX(Context context, List<File> imageFileList) {

        //判斷是否安裝微信,如果沒有安裝微信 又沒有判斷就直達微信分享是會掛掉的
        if (!Tools.isWeixinAvilible(mContext)) {
            Toast.makeText(context, "您還沒有安裝微信", Toast.LENGTH_SHORT).show();
            return;
        }
        
        ArrayList<Uri> imageUris = new ArrayList<>();
        for (File file : imageFileList) {
            imageUris.add(Uri.fromFile(file));
        }
        if (imageUris.size() == 0) {
            ToastUtil.showShortToast("獲取圖片失敗");
            return;
        }
        Intent intent = new Intent();
        ComponentName componentName = new ComponentName(WX_PACKAGE_NAME, SHARE_IMG_UI);
        intent.setComponent(componentName);
        intent.setAction(Intent.ACTION_SEND_MULTIPLE);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, imageUris);
        context.startActivity(intent);
    }

    /**
     * Android調用系統分享的實現
     * 分享多張圖片到朋友圈:微信7.0及以上版本,朋友圈只支持單張圖片分享
     *
     * @param context
     * @param imageFileList
     */
    public void shareMultiImageToWXTimeLine(Context context, List<File> imageFileList) {

        //判斷是否安裝微信,如果沒有安裝微信 又沒有判斷就直達微信分享是會掛掉的
        if (!Tools.isWeixinAvilible(mContext)) {
            Toast.makeText(context, "您還沒有安裝微信", Toast.LENGTH_SHORT).show();
            return;
        }
        
        ArrayList<Uri> imageUris = new ArrayList<>();
        for (File file : imageFileList) {
            imageUris.add(Uri.fromFile(file));
        }

        if (imageUris.size() == 0) {
            ToastUtil.showShortToast("獲取圖片失敗");
            return;
        }

        Intent intent = new Intent();
        if (getVersionCode(context, WX_PACKAGE_NAME) < VERSION_CODE_FOR_WEI_XIN_VER7) {
            // 微信7.0以下版本
            intent.setAction(Intent.ACTION_SEND_MULTIPLE);
            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
        } else {
            // 微信7.0及以上版本,朋友圈只支持單張圖片分享
            intent.setAction(Intent.ACTION_SEND);
            intent.putExtra(Intent.EXTRA_STREAM, imageUris.get(0));
        }
        ComponentName componentName = new ComponentName(WX_PACKAGE_NAME, SHARE_TO_TIMELINE_UI);
        intent.setComponent(componentName);
        intent.setType("image/*");
        // intent.putExtra("kdescription", "分享描述"); //分享描述
        context.startActivity(intent);
    }


    /**
     * 獲取制定包名應用的版本的versionCode
     *
     * @param context
     * @param
     * @return
     */
    public static int getVersionCode(Context context, String packageName) {
        try {
            PackageManager manager = context.getPackageManager();
            PackageInfo info = manager.getPackageInfo(packageName, 0);
            int version = info.versionCode;
            return version;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

ShareFragment

public class ShareFragment extends BaseFragment {

    private List<String> urlList = new ArrayList<>();

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_share;
    }

    @Override
    protected void init() {
        urlList.add("https://img.alicdn.com/imgextra/i1/650413329/O1CN01SLxEmg1aSj43VIlHm_!!650413329.jpg");
        urlList.add("https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2973069531,657782944&fm=26&gp=0.jpg");
        urlList.add("http://img.alicdn.com/imgextra/i2/2206462034816/O1CN01mZogLE1lRm0njgsRT_!!2206462034816.jpg");


    }

    @OnClick(R.id.btn_share)
    public void onViewClicked() {
        new ShareDialog(getActivity()).setOnItemClickListener(new ShareDialog.OnBottomDialogItemClickListener() {
            @Override
            public void onClick(Dialog dialog, int position) {
                switch (position) {
                    case 0: //微信
                        shareToWX();
                        break;
                    case 1: //朋友圈
                        shareToTimeLine();
                        break;
                    case 2: //qq
                        shareToQQ();
                        break;
                    case 3: //qq空間
                        shareToQQZone();
                        break;
                }
            }
        }).show();
    }

    private void shareToWX() {
        showLoading();
        DonwloadSaveImage.getImageList(urlList, new DonwloadSaveImage.OnImageFileListCallback() {
            @Override
            public void onimageFileList(ArrayList<File> imageFileList) {
                hideLoading();
                WxShareHelper.getInstnce().shareMultiImageToWX(mContext, imageFileList);
            }
        });
    }

    private void shareToTimeLine() {
        showLoading();
        DonwloadSaveImage.getImageList(urlList, new DonwloadSaveImage.OnImageFileListCallback() {
            @Override
            public void onimageFileList(ArrayList<File> imageFileList) {
                hideLoading();
                ShareHelper.getInstnce().shareMultiImageToWXTimeLine(mContext, imageFileList);
            }
        });
    }

    private void shareToQQ() {
    }

    private void shareToQQZone() {
    }


}

DonwloadSaveImage:下載和保存圖片

/**
 * Cerated by xiaoyehai
 * Create date : 2019/12/4 17:57
 * description : 下載圖片並且保存到本地
 */
public class DonwloadSaveImage {

    //線程池
    private static ExecutorService executor;
    private static Handler mHandler;

    private static String imageDirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "tjz";

    static {
        executor = Executors.newFixedThreadPool(5);
        mHandler = new Handler();
    }

    public static void getImageList(List<String> urlList, OnImageFileListCallback callback) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                deleteFile();
                ArrayList<File> localUrls = new ArrayList<>();
                for (String url : urlList) {
                    localUrls.add(downloadImage(url));
                }
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        callback.onimageFileList(localUrls);
                    }
                });
            }
        });
    }

      /* Glide.with(getActivity()) // could be an issue!
                        .load(shareimgUrl)
                        .asBitmap()   //強制轉換Bitmap
                        .into(new SimpleTarget<Bitmap>() {
                            @Override
                            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                                // //這裏我們拿到回掉回來的bitmap,可以加載到我們想使用到的地方
                                hideLoading();
                                ShareUtils.shareImage(mContext, resource, wxSceneSession);
                            }

                            @Override
                            public void onLoadFailed(Exception e, Drawable errorDrawable) {
                                super.onLoadFailed(e, errorDrawable);
                                hideLoading();
                                ToastUtil.showShortToast("加載圖片失敗");
                            }
                        });*/


    /**
     * 下載圖片
     *
     * @param url
     * @return
     */
    private static File downloadImage(String url) {
        File file = null;
        try {
            URL imageurl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) imageurl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            is.close();
            file = saveBitmap(bitmap);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    /**
     * 保存圖片到本地
     *
     * @param bitmap
     * @return
     */
    private static File saveBitmap(Bitmap bitmap) {
        File appDir = new File(imageDirPath);
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = System.currentTimeMillis() + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            //通過io流的方式來壓縮保存圖片
            bitmap.compress(Bitmap.CompressFormat.JPEG, 60, fos);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new File(imageDirPath, fileName);
    }

    private static void deleteFile() {
        File dir = new File(imageDirPath);
        if (dir.exists()) {
            File[] files = dir.listFiles();
            if (files != null) {
                for (File file : files) {
                    file.delete();
                }
            }
        }
    }

    public interface OnImageFileListCallback {
        void onimageFileList(ArrayList<File> imageFileList);
    }
}

注意問題:

實際分享的時候因爲是調用系統本地的分享功能,所以分享的圖片也就必須要存到本地,不然就會提示獲取資源失敗,只支持分享到朋友圈等等的問題。

因爲考慮到如果存的圖片太多就太佔內存了,所以最多設置分享9張。

這個是直接調用微信的分享,所以調起分享的時候一定要判斷手機裏面是否已經安裝了微信,如果沒有安裝還要掉微信分享就是直接崩潰掉。

android N系統以後分享的鏈接用file://…的時候會出現一個異常android.os.FileUriExposedException。網上雖然很多朋友都給出了用 v4包中的FileProvider來解決,但是不知道爲什麼,反正我的項目導入後就報錯了,最後在網上找了另一個方法在項目的BaseApplication的onCreate中用VmPolicy的方法解決。

/解決android N(>=24)系統以上分享 路徑爲file://時的 android.os.FileUriExposedException異常
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章