之前各种分享都做过,唯独QQ的不曾接入,可能我做的产品只是合适年龄大些的吧.扯远了。。。
刚开始直接去QQ互联开放平台文档中心添加jar包,初始化什么的就简单完成了,一运行坑点很多,下面就记录下
坑1.QQ分享单张图只能从本地获取路径分享,直接贴代码,便于大家搬运哈哈
//iv_img 是我把view转成图片的imgview,这里随意历史任何布局都可以转成你想要的图 Bitmap b; if (iv_img.getDrawingCache() != null) { b = iv_img.getDrawingCache(); } else { b = loadBitmapFromView(iv_img); } saveBitmap(b); onClickShareToQQ();
//view转成图片 public static Bitmap loadBitmapFromView(View v) { if (v == null) { return null; } v.setDrawingCacheEnabled(true); Bitmap screenshot; v.measure(View.MeasureSpec.makeMeasureSpec(v.getWidth(), View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec( v.getHeight(), View.MeasureSpec.UNSPECIFIED)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); v.buildDrawingCache(); screenshot = v.getDrawingCache(); if (screenshot == null) { v.setDrawingCacheEnabled(true); screenshot = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(screenshot); c.translate(-v.getScrollX(), -v.getScrollY()); v.draw(c); return screenshot; } return screenshot; }
/** * 保存图片到本地 * */ public void saveBitmap(Bitmap bm) { isHaveSDCard(); if (isHaveSDCard()) { File = Environment.getExternalStorageDirectory(); } else { File = Environment.getDataDirectory(); } File = new File(File.getPath() + "/MotieReader/data/"); if (!File.isDirectory()) { File.delete(); File.mkdirs(); } if (!File.exists()) { File.mkdirs(); } writeBitmap(File.getPath(), picName, bm); } /** * 保存图片 * * @param path * @param name * @param bitmap */ public static void writeBitmap(String path, String name, Bitmap bitmap) { File file = new File(path); if (!file.exists()) { file.mkdirs(); } File _file = new File(path + name); if (_file.exists()) { _file.delete(); } FileOutputStream fos = null; try { fos = new FileOutputStream(_file); if (name != null && !"".equals(name)) { int index = name.lastIndexOf("."); if (index != -1 && (index + 1) < name.length()) { String extension = name.substring(index + 1).toLowerCase(); if ("png".equals(extension)) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); } else if ("jpg".equals(extension) || "jpeg".equals(extension)) { bitmap.compress(Bitmap.CompressFormat.JPEG, 75, fos); } } } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } //判断内存卡是否存在 public boolean isHaveSDCard() { String SDState = android.os.Environment.getExternalStorageState(); if (SDState.equals(android.os.Environment.MEDIA_MOUNTED)) { return true; } return false; }
//QQ分享好友和空间的代码
private void onClickShareToQQ() {
Bundle shareParams = new Bundle(); shareParams.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE); shareParams.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, File.getPath() + picName); shareParams.putString(QQShare.SHARE_TO_QQ_APP_NAME, "LPS CRM"); //分享到QQ好友 SHARE_TO_QQ_FLAG_QZONE_ITEM_HIDE 分享到空间SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN shareParams.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN); doShareToQQ(shareParams); }
//qq分享 private void doShareToQQ(final Bundle params) { // QQ分享要在主线程做 ThreadManager.getMainHandler().post(new Runnable() { @Override public void run() { if (null != mTencent) { mTencent.shareToQQ(NewBigRecycleActivity.this, params, qqShareListener); } } }); }IUiListener qqShareListener = new IUiListener() { @Override public void onCancel() { Toast.makeText(NewBigRecycleActivity.this, "取消分享", Toast.LENGTH_SHORT).show(); } @Override public void onComplete(Object response) { // TODO Auto-generated method stub Toast.makeText(NewBigRecycleActivity.this, "分享成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(UiError e) { // TODO Auto-generated method stub Log.d("bbbbbb", "onError: 分享错误"); Toast.makeText(NewBigRecycleActivity.this, "分享错误", Toast.LENGTH_SHORT).show(); } };
坑2.QQ分享完后不回调监听的结果....居然还这问题,于是还是百度啦,得知
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //此处必须添加这个回调(解决QQ分享不回调问题) Tencent.onActivityResultData(requestCode, resultCode, data, new IUiListener() { @Override public void onComplete(Object o) { Toast.makeText(NewBigRecycleActivity.this, "分享成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(UiError uiError) { Toast.makeText(NewBigRecycleActivity.this, "分享错误", Toast.LENGTH_SHORT).show(); } @Override public void onCancel() { Toast.makeText(NewBigRecycleActivity.this, "取消分享", Toast.LENGTH_SHORT).show(); } }); }
坑3.QQ分享完后总是回调Cancle这个回调方法
初始化Tentcent的Appid是数字,而配置清单中的是tentcent+APPId,如果不一致就会总是回调cancle这个回调
就完了,难怪QQ分享用的人少,坑那么多,文档还停留在17年的,幸好有广大安卓前辈铺路...
我这也是做个做个记录,方便后面的同学少走弯路,一步集成到位...
安排......