解决Android调用系统分享给微信,出现分享失败,分享多文件必须为图片格式的问题

作者:Huangzu98 时间:2023-07-03 11:08:04 

解决Android调用系统分享图片给微信,出现分享失败,分享多文件必须为图片格式

近期应公司需求,分享多图片到微信的功能,之前一直是用微信自己家SDK实现分享,但是查看微信的原生SDK是不具备多图分享的。在网上查找解决办法,直接调用手机系统进行分享,进行系统分享时分享给QQ,微博等都可以,但分享微信时就会出现分享失败,分享多文件必须为图片格式,看网上各路大神都各显神通都没解决具体问题,于是自己就总结出此篇文章为后来者少踩些坑,让你更快完成公司交给你的任务,让产品经理对你刮目相看,话不多说直接上干货。


private void systemShareWeChat(int shareTag,String photoPath){
   Resources res=getResources();
   Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.share);
   File f = null;

ComponentName comp1,comp;
   comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");//调用系统分享给微信朋友
   comp1 = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");//调用系统分享给微信朋友圈

try {
   //将Android中drawable图片保存到本地
     String dir= Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"share"+".jpg";
      f = new File(dir);
     if (!f.exists()) {
       f.getParentFile().mkdirs();
       f.createNewFile();
     }
     FileOutputStream out = new FileOutputStream(f);
     bmp.compress(Bitmap.CompressFormat.PNG, 80, out);
     out.flush();
     out.close();
     Uri uri = FileProvider.getUriForFile(NativePhoto.this.getApplicationContext(),
         "com.lipuwulian.blesample.provider", f);//这个是版本大于Android7.0(包含)临时访问文件,没有这个会报异常
   } catch (FileNotFoundException e) {
     e.printStackTrace();
   } catch (IOException e) {
     e.printStackTrace(); }

ArrayList<Uri> imageUris = new ArrayList<Uri>();
   imageUris.add(UrigetImageContentUri(NativePhoto.this,new File(photoPath)));//这个是分享本地存储的图片
   imageUris.add(UrigetImageContentUri(NativePhoto.this,f));
   Intent shareIntent = new Intent();
   shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
   if(shareTag==0){
     shareIntent.setComponent(comp1);//分享给微信朋友圈
   }else if(shareTag==1){
     shareIntent.setComponent(comp);//分享给微信朋友
   }
   //如果去掉shareIntent.setComponent("*");系统会调出所有的分享软件
   shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
   shareIntent.setType("image/*");
   startActivity(shareIntent);

}

//如果是微信分享的话一定一定将这个直接复制到自己项目中,将自己图片路径换为content:不然就会出现上述错误


public static Uri UrigetImageContentUri(Context context, File imageFile) {

String filePath = imageFile.getAbsolutePath();
   Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
   new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA +"=? ", new String[]{filePath}, null);

Uri uri =null;

if (cursor !=null) {
     if (cursor.moveToFirst()) {

int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));

Uri baseUri = Uri.parse("content://media/external/images/media");

uri = Uri.withAppendedPath(baseUri, "" + id);
   }
     cursor.close();
   }
   if (uri ==null) {
     ContentValues values =new ContentValues();
     values.put(MediaStore.Images.Media.DATA, filePath);
     uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
   }
   return uri;

}

这样就解决了调用系统分享报出分享失败,分享多文件必须为图片格式的错误了。

在AndroidManifest中临时文件注册解决Android7.0版本及其之后文件uri报错问题


<application
   android:allowBackup="true"
   android:icon="@drawable/logo"
   android:label="@string/app_name1"
   android:supportsRtl="true"
   android:theme="@style/AppTheme">

<!--    //临时访问文件的注册-->
   <provider
     android:name="android.support.v4.content.FileProvider"
     android:authorities="com.lipuwulian.blesample.provider"//这是自己的包名加“.provider”
     android:exported="false"
     android:grantUriPermissions="true">
     <meta-data
       android:name="android.support.FILE_PROVIDER_PATHS"
       android:resource="@xml/file_paths" />
   </provider>

<activity android:name="com.lipuwulian.blesample.MainActivity">
     <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
   </activity>

</application>

在res文件夹下创建xml文件夹、

解决Android调用系统分享给微信,出现分享失败,分享多文件必须为图片格式的问题

file_paths文件里的内容:path是data/包名加.testapplication/


<?xml version="1.0" encoding="utf-8"?>
<resources>
 <paths>
   <external-path
     name="files_root"
     path="Android/data/com.lipuwulian.blesample.testapplication/" />
   <external-path
     name="external_storage_root"
     path="." />
 </paths>
</resources>

到这里就结束了,希望能够帮到大家哦!IT需要爱与和平😊

来源:https://blog.csdn.net/qq_42754787/article/details/108509027

标签:android,调用系统,分享微信
0
投稿

猜你喜欢

  • java文件下载代码实例(单文件下载和多文件打包下载)

    2023-02-16 00:38:37
  • java实现小猫钓鱼游戏

    2021-10-10 19:59:48
  • C#使用opencv截取旋转矩形区域图像的实现示例

    2023-11-12 22:20:44
  • 浅谈maven单元测试设置代理

    2022-03-14 20:23:04
  • 详解C# WinForm如何实现自动更新程序

    2022-03-04 02:19:29
  • 一文详解kafka序列化器和拦截器

    2023-06-18 01:06:08
  • 根据灰度值填充字符-单文件单线程版

    2023-10-12 00:50:24
  • mybatis主从表关联查询,返回对象带有集合属性解析

    2023-06-15 16:10:59
  • Springmvc加ajax实现上传文件并页面局部刷新

    2023-07-31 09:26:47
  • SpringBoot数据层测试事务回滚的实现流程

    2022-05-01 14:36:37
  • java spring mvc处理器映射器介绍

    2021-11-22 01:01:35
  • c#实现哈夫曼树算法

    2022-11-24 08:25:02
  • 一文带你了解RabbitMQ消息转换器

    2023-11-15 23:22:28
  • Java无限级树(递归)超实用案例

    2023-08-01 13:31:57
  • mybatis-plus使用generator实现逆向工程

    2022-06-05 20:16:49
  • JFinal使用ajaxfileupload实现图片上传及预览

    2023-08-05 08:30:48
  • SpringBoot多模块项目框架搭建过程解析

    2022-10-02 06:12:34
  • C#汉字转换拼音技术详解(高性能)

    2022-01-19 02:03:16
  • 安卓中出现过的一些容易被忽略的异常整理

    2023-12-17 06:27:53
  • 老生常谈Scanner的基本用法

    2021-08-27 00:34:18
  • asp之家 软件编程 m.aspxhome.com