直接在屏幕上,选取区域进行截屏分享到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以上的手机),需要动态请求权限,参考下面这个:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值