版权声明:本文为HaiyuKing原创文章,转载请注明出处!前言根据参考资料的文章,整理了调用系统自带分享的工具类(实现了适配7.0FileProvider的功能),需要搭配《Android6 版权声明:本
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
根据参考资料的文章,整理了调用系统自带分享的工具类(实现了适配7.0FileProvider的功能),需要搭配《Android6.0运行时权限(基于RxPermission开源库)》。
效果图
代码分析
需要注意的代码主要包括:
ShareIntentUtil中适配7.0FileProvider的相关代码。
使用步骤
一、项目组织结构图
注意事项:
1、 导入类文件后需要change包名以及重新import R文件路径
2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖
二、导入步骤
(1)将ShareIntentUtil.java文件复制到项目中


(2)在AndroidManifest.xml中添加权限以及配置7.0FileProvider【注意:provider中的android:authorities值:${applicationId}.provider,其中${applicationId}代表的真实值就是APP的build.gradle中的applicationId(包名)值】
(3)将provider_paths文件复制到项目的res/xml目录下【适配7.0FileProvider】
(4)参考《Android6.0运行时权限(基于RxPermission开源库)》导入相关文件。
三、使用方法
布局文件


在Activity中使用【先申请权限,然后执行相关方法:注意,Demo中指定了文件路径,实际项目中一般是动态获取的】
package com.why.project.sharewithsystemdemo;import android.Manifest;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Toast;import com.tbruyelle.rxpermissions2.RxPermissions;import com.why.project.sharewithsystemdemo.util.ShareIntentUtil;import java.io.File;import java.util.ArrayList;import io.reactivex.functions.Action;import io.reactivex.functions.Consumer;public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); onePermission(); initEvents(); } private void initEvents() { //分享文本 findViewById(R.id.btn_share_text).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ShareIntentUtil.shareText(MainActivity.this,"这是一段分享的文字","分享文本"); } }); //分享单张图片 findViewById(R.id.btn_share_one_img).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Environment.getExternalStorageDirectory()=/storage/emulated/0 Log.e("why","Environment.getExternalStorageDirectory()="+Environment.getExternalStorageDirectory()); String imagePath = Environment.getExternalStorageDirectory() + File.separator + "DCIM/Camera/IMG_20160723_103940.jpg"; ShareIntentUtil.shareOneImg(MainActivity.this,imagePath,"分享单张图片"); } }); //分享多张图片 findViewById(R.id.btn_share_mult_img).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Environment.getExternalStorageDirectory()=/storage/emulated/0 Log.e("why","Environment.getExternalStorageDirectory()="+Environment.getExternalStorageDirectory()); ArrayList imgPathList = new ArrayList(); String path = Environment.getExternalStorageDirectory() + File.separator; imgPathList.add(path+"DCIM/Camera/IMG_20160723_103940.jpg"); imgPathList.add(path+"DCIM/Camera/IMG_20170820_121408.jpg"); imgPathList.add(path+"DCIM/Camera/IMG_20171001_080012.jpg"); ShareIntentUtil.shareMultImg(MainActivity.this,imgPathList,"分享多张图片"); } }); //分享到qq findViewById(R.id.btn_share_to_qq).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ShareIntentUtil.shareTextTo(MainActivity.this,"这是一段分享的文字","分享到QQ",ShareIntentUtil.PACKAGE_QQ); } }); //分享单个文件 findViewById(R.id.btn_share_one_file).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Environment.getExternalStorageDirectory()=/storage/emulated/0 Log.e("why","Environment.getExternalStorageDirectory()="+Environment.getExternalStorageDirectory()); String filePath = Environment.getExternalStorageDirectory() + File.separator + "why/AndroidNotesForProfessionals.pdf"; ShareIntentUtil.shareOneFile(MainActivity.this,filePath,"分享单个文件"); } }); } /**只有一个运行时权限申请的情况*/ private void onePermission(){ RxPermissions rxPermissions = new RxPermissions(MainActivity.this); // where this is an Activity instance rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE) //权限名称,多个权限之间逗号分隔开 .subscribe(new Consumer() { @Override public void accept(Boolean granted) throws Exception { Log.e(TAG, "{accept}granted=" + granted);//执行顺序——1【多个权限的情况,只有所有的权限均允许的情况下granted==true】 if (granted) { // 在android 6.0之前会默认返回true // 已经获取权限 Toast.makeText(MainActivity.this, "已经获取权限", Toast.LENGTH_SHORT).show(); } else { // 未获取权限 Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show(); } } }, new Consumer() { @Override public void accept(Throwable throwable) throws Exception { Log.e(TAG,"{accept}");//可能是授权异常的情况下的处理 } }, new Action() { @Override public void run() throws Exception { Log.e(TAG,"{run}");//执行顺序——2 } }); }}混淆配置
无
参考资料
Android分享---调用系统自带的分享功能
探索Android调用系统的分享功能
Intent.resolveActivity
项目demo下载地址
https://github.com/haiyuKing/ShareWithSystemDemo