前言:大大小小的项目现在应该都会加入分享,sharesdk无非是开发者的首选,关于接入ShareSdk步骤官网讲的很详细ShareSdk官网,下面贴出自己封装的分享工具类。
分享工具类:代码地址
下面贴出源码:
ShareUtil
/**
* 分享操作类
*/
public class ShareUtil {
private static Context sContext;
/**
* 静态代码块,用于初始化sharesdk
* 这里是我根据自己项目的封装获取的上下文,
* 大家可以在项目启动时application的相关类中写入获取上下文,然后在这里引用
*/
static {
sContext = GlobalVars.getContext();
ShareSDK.initSDK(sContext);
}
/**
*
* @param context 上下文
* @param title 分享显示的标题
* @param content 分享显示的内容
* @param comment 分享的评论
* @param url 分享后点击的链接地址
*/
public static void showShare(Context context, String title, String content, String comment, String url) {
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
oks.setTitle(title);
// titleUrl是标题的网络链接,仅在人人网和QQ空间使用
oks.setTitleUrl(url);
// text是分享文本,所有平台都需要这个字段
oks.setText(content);
//分享网络图片,新浪微博分享网络图片需要通过审核后申请高级写入接口,否则请注释掉测试新浪微博
oks.setImageUrl(url);
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
oks.setImagePath(getShareLogImgPath());//确保SDcard下面存在此张图片
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl(url);
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
oks.setComment(comment);
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite("扶睿课堂");
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl(url);
// 启动分享GUI
oks.show(context);
}
/**
*
* @return 返回assets下的图片,该图片一般为app的logo
*/
private static String getShareLogImgPath() {
File dir = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + File.separator + ".fredu");
if (!dir.exists())
dir.mkdirs();
File imgFile = new File(dir.getAbsolutePath() + File.separator
+ "share_logo.png");
if (!imgFile.exists()) {
FileUtils.copyFileFromAssets("share_logo.png",
imgFile.getAbsolutePath());
}
return imgFile.getAbsolutePath();
}
}
FileUtils(ShareUtils中用到的)
/**
* 文件操作类
*/
public class FileUtils {
private static final String TAG = "FileUtils";
/**
* @param file
*/
public static void deleteFile(File file) {
if(file == null || !file.exists()) {
return;
}
if(file.isFile()) {
final File to = new File( file.getAbsolutePath() + System.currentTimeMillis());
file.renameTo( to);
to.delete();
}
else {
File[] files = file.listFiles();
if(files != null && files.length > 0) {
for(File innerFile: files) {
deleteFile( innerFile);
}
}
final File to = new File( file.getAbsolutePath() + System.currentTimeMillis());
file.renameTo( to);
to.delete();
}
}
/**
* Try to return the absolute file path from the given Uri
*
* @param context
* @param uri
* @return the file path or null
*/
public static String getRealFilePath(final Context context, final Uri uri ) {
if ( null == uri ) return null;
final String scheme = uri.getScheme();
String data = null;
if ( scheme == null )
data = uri.getPath();
else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) {
data = uri.getPath();
} else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) {
Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null );
if ( null != cursor ) {
if ( cursor.moveToFirst() ) {
int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA );
if ( index > -1 ) {
data = cursor.getString( index );
}
}
cursor.close();
}
}
return data;
}
public static void copyFileFromAssets(String resourceFileName, String targetFile) {
AssetManager am = GlobalVars.getContext().getAssets();
try {
InputStream fis = am.open(resourceFileName);
OutputStream os = new FileOutputStream(new File(targetFile));
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff)) != -1) {
os.write(buff, 0, len);
}
os.flush();
os.close();
fis.close();
} catch (IOException e) {
LogUtil.error(TAG, e);
}
}
}
集成分享遇到的问题:
在项目中集成分享后,需要去相关平台申请获得相关的id和key(这个只要跟着官网的步骤走,就没问题)。申请时会用到app签名,如果还不知道怎么获取可以看看这篇文章如何获取app签名。那么问题来了,如果相关平台申请时填入的签名是release的签名,那么请你在测试分享的时候也打成release包;反之如果是debug那么也是打成debug包测试。不然的话你会遇到和我一样的疑问(怎么昨天分享还好好的今天就不能用了,我也没动过代码啊,当然这样弱智的问题也就我这样的初学者会遇到然后还傻不拉几的郁闷上半天,对了遇到问题千万别心慌,自己找不到答案,像这种第三方就去找客服,那里会告诉你)。好了分享就这样搞定,其实没什么难点,静下心跟着官网步骤走就没错。
说明:以上代码是根据目前为止最新的文档封装的,大家可以参考,一切以官网为准。
end.
欢迎留言指教!