Android-将View转换成图片分享到QQ,微信(不使用第三方API)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyl424525/article/details/77649309

效果:将如图所示的一个LinearLayout分享到qq

布局代码为:

   <!--左边表情处理区域-->
            <LinearLayout
                android:id="@+id/custom_linearlayout"
                android:layout_width="280dp"
                android:layout_height="280dp"
                android:orientation="vertical"
                >
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="8"
                    android:background="@drawable/img_visualty2"
                    android:gravity="center"
                    android:orientation="vertical">

                    <ImageView
                        android:id="@+id/img_expression"
                        android:layout_width="90dp"
                        android:layout_height="90dp"
                        android:layout_gravity="center"

                        android:src="@drawable/expression1" />

                </LinearLayout>


                <TextView
                    android:id="@+id/text_expression"
                    android:layout_width="match_parent"
                    android:layout_height="30dp"
                    android:layout_gravity="center"
                    android:background="#fff"
                    android:gravity="center"
                    android:text="暗中观察"
                    android:textSize="18sp" />
            </LinearLayout>

1.定义一个辅助类


import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;
import android.widget.Toast;

import com.biaoqing.xueyuan.R;

import java.util.List;

/**
 * Created by YYL on 2017/8/28.
 */

public class AndroidShare {

    /**
     * 上下文
     */
    private Context context;

    /**
     * 文本类型
     *
     */
    public static int TEXT = 0;

    /**
     * 图片类型
     */
    public static int DRAWABLE = 1;

    public AndroidShare(Context context) {
        this.context = context;
    }

    /**
     * 分享到QQ好友
     *
     * @param msgTitle
     *            (分享标题)
     * @param msgText
     *            (分享内容)
     * @param type
     *            (分享类型)
     * @param drawable
     *            (分享图片,若分享类型为AndroidShare.TEXT,则可以为null)
     */
    public void shareQQFriend(String msgTitle, String msgText, int type,
                              Bitmap drawable) {

        shareMsg("com.tencent.mobileqq",
                "com.tencent.mobileqq.activity.JumpActivity", "QQ", msgTitle,
                msgText, type, drawable);
    }


    /**
     * 分享到微信好友
     *
     * @param msgTitle
     *            (分享标题)
     * @param msgText
     *            (分享内容)
     * @param type
     *            (分享类型)
     * @param drawable
     *            (分享图片,若分享类型为AndroidShare.TEXT,则可以为null)
     */
    public void shareWeChatFriend(String msgTitle, String msgText, int type,
                                  Bitmap drawable) {

        shareMsg("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI", "微信",
                msgTitle, msgText, type, drawable);
    }

    /**
     * 分享到微信朋友圈(分享朋友圈一定需要图片)
     *
     * @param msgTitle
     *            (分享标题)
     * @param msgText
     *            (分享内容)
     * @param drawable
     *            (分享图片)
     */
    public void shareWeChatFriendCircle(String msgTitle, String msgText,
                                        Bitmap drawable) {

        shareMsg("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI",
                "微信", msgTitle, msgText, AndroidShare.DRAWABLE, drawable);
    }

    /**
     * 点击分享的代码
     *
     * @param packageName
     *            (包名,跳转的应用的包名)
     * @param activityName
     *            (类名,跳转的页面名称)
     * @param appname
     *            (应用名,跳转到的应用名称)
     * @param msgTitle
     *            (标题)
     * @param msgText
     *            (内容)
     * @param type
     *            (发送类型:text or pic 微信朋友圈只支持pic)
     */
    @SuppressLint("NewApi")
    private void shareMsg(String packageName, String activityName,
                          String appname, String msgTitle, String msgText, int type,
                          Bitmap drawable) {
        if (!packageName.isEmpty() && !isAvilible(context, packageName)) {// 判断APP是否存在
            Toast.makeText(context, "请先安装" + appname, Toast.LENGTH_SHORT)
                    .show();
            return;
        }

        Intent intent = new Intent("android.intent.action.SEND");
        if (type == AndroidShare.TEXT) {
            intent.setType("text/plain");
        } else if (type == AndroidShare.DRAWABLE) {
            intent.setType("image/*");
//          BitmapDrawable bd = (BitmapDrawable) drawable;
//          Bitmap bt = bd.getBitmap();
            final Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(
                    context.getContentResolver(), drawable, null, null));
            intent.putExtra(Intent.EXTRA_STREAM, uri);
        }

        intent.putExtra(Intent.EXTRA_SUBJECT, msgTitle);
        intent.putExtra(Intent.EXTRA_TEXT, msgText);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (!packageName.isEmpty()) {
            intent.setComponent(new ComponentName(packageName, activityName));
            context.startActivity(intent);
        } else {
            context.startActivity(Intent.createChooser(intent, msgTitle));
        }
    }

    /**
     * 判断相对应的APP是否存在
     *
     * @param context
     * @param packageName
     * @return
     */
    public boolean isAvilible(Context context, String packageName) {
        PackageManager packageManager = context.getPackageManager();

        List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
        for (int i = 0; i < pinfo.size(); i++) {
            if (((PackageInfo) pinfo.get(i)).packageName
                    .equalsIgnoreCase(packageName))
                return true;
        }
        return false;
    }

//    将view转换成bitmap
    public  Bitmap convertViewToBitmap(View view){
        view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
        view.buildDrawingCache();
        Bitmap bitmap = view.getDrawingCache();
        return bitmap;
    }
    /**
     * 指定分享到qq
     * @param context
     * @param bitmap
     */
    public void sharedQQ(Activity context, Bitmap bitmap){
        Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(
                context.getContentResolver(), BitmapFactory.decodeResource(context.getResources(), R.drawable.img002), null, null));
        Intent imageIntent = new Intent(Intent.ACTION_SEND);
        imageIntent.setPackage("com.tencent.mobileqq");
        imageIntent.setType("image/*");
        imageIntent.putExtra(Intent.EXTRA_STREAM, uri);
        imageIntent.putExtra(Intent.EXTRA_TEXT,"您的好友邀请您进入天好圈");
        imageIntent.putExtra(Intent.EXTRA_TITLE,"天好圈");
        context.startActivity(imageIntent);
    }
}

2.使用:将一个LinearLayout分享到QQ

LinearLayout custom_linearlayout;
custom_linearlayout= (LinearLayout) findViewById(R.id.custom_linearlayout);
 AndroidShare androidShare=new AndroidShare(this);
                Bitmap bitmap=androidShare.convertViewToBitmap(custom_linearlayout);
                androidShare.shareQQFriend("title","text",1,bitmap);

当然也可以分享到微信好友,朋友圈等

3.若出现权限的问题

Failed to insert image
                                                              java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=793, uid=10292 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
                                                                  at android.os.Parcel.readException(Parcel.java:1665)
。。。。。。。。。。。

见这篇Android6.0权限问题解决:
http://blog.csdn.net/yyl424525/article/details/55254086
将下面的权限加到权限数组即可

Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,

附:也可见这位朋友的,原理一样
http://blog.csdn.net/qq_25117839/article/details/51871180

猜你喜欢

转载自blog.csdn.net/yyl424525/article/details/77649309