1. 程式人生 > >直接在螢幕上,選取區域進行截圖分享到QQ、微信

直接在螢幕上,選取區域進行截圖分享到QQ、微信

在手機螢幕上,選擇某個區域進行截圖。

  • 1,借用網路上一張圖片,說明每個點的位置,主要是左上角和右下角這兩個點。中間那塊淺藍色的就是我們的目標區域了
    這裡寫圖片描述
    /**
     * 將一個view儲存成圖片
     * @param view 傳入的目標view
     * @return
     */
    public static Bitmap loadBitmapFromView(View view) {

        view.setDrawingCacheEnabled(true);
        view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
        view.setDrawingCacheBackgroundColor(Color.WHITE);

        int w1 = view.getLeft();
        int h1 = view.getTop();

        /
/int w2 = view.getWidth()+view.getLeft(); //int h2 = view.getHeight()+view.getTop(); //相當於上面的 int w2 = view.getRight(); int h2 = view.getBottom(); //w2-w1, h2-h1這個兩個引數要注意一下,要不圖片的背景色和圖片的大小不一 Bitmap bmp = Bitmap.createBitmap(w2-w1, h2-h1,Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bmp); c.drawColor(Color.WHITE); /
** 如果不設定canvas畫布為白色,則生成透明 */ view.layout(w1, h1, w2, h2); view.draw(c); return bmp; }
  • 2,接下來就是儲存我們第一步截出來的圖片
    /**
     * 儲存圖片到本地
     * 
     */
    public void saveBitmap(Context context, Bitmap bitmap) {

        String sdCardDir = Environment.getExternalStorageDirectory() + "/
DCIM/"; File appDir = new File(sdCardDir, "cache");//資料夾名稱 if (!appDir.exists()) { appDir.mkdir(); } //檔名,這裡你是如果要儲存到本地,每次儲存的圖片的名稱都得不一樣 //檔名加一個當前時間就好:System.currentTimeMillis() String fileName = "InvitationCard_" + "chuangqi.jpg"; mFile = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(mFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Log.d("Tag-----", appDir+fileName);//這裡做一個簡單的列印 }
  • 3,接下來就是分享圖片,這裡用的是開放平臺上的SDK,只做關鍵程式碼的分析。不是友盟和sharesdk的

    • 微信
    /**
     * 邀請卡的分享
     * 微信、朋友圈分享
     * @param flag  0是分享給微信好友,1是分享到朋友圈
     */
    public void shareCard(int flag) {
        waitDialog.show();
        if (!wxApi.isWXAppInstalled()) {
            Toast.makeText(this, "您還未安裝微信客戶端", Toast.LENGTH_SHORT).show();
            waitDialog.dismiss();
            return;
        }

        Bitmap thumb = null;
        /*
        *主要路徑儘量主要寫,不能直接寫死,因為不用手機保持時的路徑有所不同,下面兩個就是例子
        */storage/sdcard0/DCIM/cacheInvitationCard_chuangqi.png
        */storage/emulated/0/DCIM/cacheInvitationCard_chuangqi.jpg
        */
        File file = new File(Environment.getExternalStorageDirectory()+"/DCIM/cache/InvitationCard_chuangqi.jpg");
        if (file.exists()){
            thumb = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/DCIM/cache/InvitationCard_chuangqi.png");
        }
        WXImageObject imageObject = new WXImageObject(thumb);
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imageObject;
        msg.title = "標題";
        msg.description = "描述";

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("image/*");//請求的唯一標識
        req.message = msg;
        req.scene = flag == 0 ? SendMessageToWX.Req.WXSceneSession : SendMessageToWX.Req.WXSceneTimeline;
        boolean fla = wxApi.sendReq(req);
        waitDialog.dismiss();
        //測試用的,通過下面標記fla判斷是否能調起客戶端,true就是可以
        //Toast.makeText(this, "微信客戶端"+"fla=" + fla, Toast.LENGTH_SHORT).show();
    }

使用:
    //分享到微信好友
    shareCard(0);
    //分享到微信朋友圈
    shareCard(1);
  • QQ
    /**
     * 邀請卡的分享
     * 微信分享在activity中寫
     * 分享到QQ
     * @param type  1是分享給好友,2是分享到QQ空間
     */
    public void shareQQCard(int type) {
        if (!SystemUtils.checkMobileQQ(BaseActivity.this)) {
            Toast.makeText(BaseActivity.this, "您還未安裝QQ客戶端", Toast.LENGTH_SHORT).show();
            return;
        }
        Bundle params = new Bundle();
        params.putString(QQShare.SHARE_TO_QQ_APP_NAME, "應用名稱");
        params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, Environment.getExternalStorageDirectory()+"/DCIM/cache/InvitationCard_chuangqi.png");
        params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
        if (type == 1) {
            params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
        }
        mTencent.shareToQQ(BaseActivity.this, params, new BaseUiListener());
        //Log.d("Tags-", imagePath);
        //Toast.makeText(this, "QQ客戶端"+"type=" + type, Toast.LENGTH_SHORT).show();
    }


使用:
    //分享到微信好友
    shareQQCard(1);
    //分享到微信朋友圈
    shareQQCard(2);
  • 還有一種相當簡單的分享方式,直接調起客戶端。下面是微信的,沒有安裝客戶端可能程式會奔潰,所以最好先判斷一下是否已經安裝了客戶端
//直接用微信給我們留的分享介面,注意這個路徑,在儲存時列印就知道了
Uri imageUri = Uri.fromFile(new File("/storage/sdcard0/DCIM/cache/InvitationCard_chuangqi.png"));
Intent shareIntent = new Intent();
ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");//包名和介面的路徑,這個是分享給微信好友的
//ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");//包名和介面的路徑,這個是分享給微信朋友圈
shareIntent.setComponent(comp);
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "分享圖片"));

不過這種簡單的方式,不知道如何監聽它的回撥(分享成功、失敗、取消),如果有知道請也告訴我一下,虛心求教!

部分手機分享失敗(華為6.0以上的手機),需要動態請求許可權,參考下面這個: