最近做游戏分享功能,遇到了这3大平台的分享,网上的介绍好多,但也不全,没有做到很详细的分享图片,文字,链接的介绍,所以我结合了一下,自己封装了3大平台的分享。
一,google+分享
不需要申请,直接代码。
1 图片和链接分享
public class GoogleShare {
private static GoogleShare mInstance;
public static GoogleShare getInstance() {
if (mInstance == null) {
mInstance = new GoogleShare();
}
return mInstance;
}
public void share(Activity mContext, String imagePath, String link, String title) {
try {
// 判断是否安装Google Service
if (GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext) == ConnectionResult.SUCCESS) {
//本地图片
if (!imagePath.equals("")) {
File file = new File(imagePath);
Uri imageUri = URIUtil.getImageContentUri(mContext, file);
Log.d("GoogleShare", imageUri.getPath());
Intent shareIntent = new PlusShare.Builder(mContext).setType("image/*").setText(title)
.setStream(imageUri).getIntent();
mContext.startActivityForResult(shareIntent, Constant.RC_GOOGLE_SHARE);
}
//链接
if (!link.equals("")) {
Intent shareIntent = new PlusShare.Builder(mContext).setType("text/*").setText(title)
.setContentUrl(Uri.parse(link)).getIntent();
mContext.startActivityForResult(shareIntent, Constant.RC_GOOGLE_SHARE);
}
} else {
Toast.makeText(mContext, "Please install Google Service", 0).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == Constant.RC_GOOGLE_SHARE) {
if (resultCode == Activity.RESULT_OK) {
//success
} else if (resultCode == Activity.RESULT_CANCELED) {
//cancel
} else {
//failure
}
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
GoogleShare.getInstance().onActivityResult(requestCode, resultCode, data);
}
2 如果是从相册获取图片,也可以先对图片进行压缩再分享
Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
if (Build.VERSION.SDK_INT < 19) {
intent.setAction(Intent.ACTION_GET_CONTENT);
} else {
intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
}
startActivityForResult(intent, 0);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == RESULT_OK) {
Intent shareIntent = new PlusShare.Builder(this).setType("image/*").setText("title")
.setStream(data.getData()).getIntent();
startActivityForResult(shareIntent, Constant.RC_GOOGLE_SHARE);
}
}
3 AndroidManifest.xml
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
二 facebook分享
需要在平台创建应用和获取应用编号,具体我上一篇facebook登录说明了
1图片和链接分享
public class FacebookShare {
public static CallbackManager manager = CallbackManager.Factory.create();
private static FacebookShare mInstance;
private ShareDialog shareDialog;
public static FacebookShare getInstance() {
if (mInstance == null) {
mInstance = new FacebookShare();
}
return mInstance;
}
public void share(Activity activity, String imagePath, String link, String title, String desc) {
try {
shareDialog = new ShareDialog(activity);
shareDialog.registerCallback(manager, new FacebookCallback<Sharer.Result>() {
@Override
public void onCancel() {
//cancel
}
@Override
public void onError(FacebookException error) {
//
}
@Override
public void onSuccess(Sharer.Result result) {
//success
}
});
if (imagePath != null) {
if (ShareDialog.canShow(SharePhotoContent.class)) {
// 本地图片
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
// 压缩图片
Bitmap newBitmap = BitmapUtil.getBitmap(bitmap);
SharePhoto photo = new SharePhoto.Builder().setCaption(title).setBitmap(newBitmap).build();
SharePhotoContent photoContent = new SharePhotoContent.Builder().addPhoto(photo).build();
shareDialog.show(photoContent);
}
}
if (!link.equals("")) {
if (ShareDialog.canShow(ShareLinkContent.class)) {
// 链接
ShareLinkContent linkContent = new ShareLinkContent.Builder().setContentTitle(title)
.setContentDescription(desc).setContentUrl(Uri.parse(link)).build();
shareDialog.show(linkContent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
FacebookShare.manager.onActivityResult(requestCode, resultCode, data);
}
2 如果是从相册获取图片,也可以先对图片进行压缩再分享
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == RESULT_OK) {
SharePhoto photo = new SharePhoto.Builder().setCaption("title").setImageUrl(data.getData()).build();
SharePhotoContent photoContent = new SharePhotoContent.Builder().addPhoto(photo).build();
shareDialog.show(photoContent);
}
}
3 AndroidManifest.xml
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
<provider
android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider1743673192422114"
android:exported="true" />
<!-- 浏览器分享卡片,未安装客户端时弹出 -->
<activity
android:name="com.facebook.CustomTabActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter>
</activity>
三 twitter分享
不需要申请,直接代码
1图片和链接分享
public class TwitterShare {
private static TwitterShare mInstance;
public static TwitterShare getInstance() {
if (mInstance == null) {
mInstance = new TwitterShare();
}
return mInstance;
}
public void share(Activity mContext, String imagePath, String link, String title) {
try {
TwitterAuthConfig authConfig = new TwitterAuthConfig(mContext.getString(R.string.twitter_consumer_key),
mContext.getString(R.string.twitter_consumer_secret));
Fabric.with(mContext, new TwitterCore(authConfig));
TweetComposer.Builder builder = new TweetComposer.Builder(mContext);
builder.text(title);
//本地图片
if (!imagePath.equals("")) {
File file = new File(imagePath);
Uri imageUri = URIUtil.getImageContentUri(mContext, file);
Log.d("TwitterShare", imageUri.getPath());
builder.image(imageUri);
}
//链接
if (!link.equals("")) {
builder.url(new URL(link));
}
builder.show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
<string name="twitter_consumer_key"></string>
<string name="twitter_consumer_secret"></string>
这个key可以随便,但一定要有
2 如果是从相册获取图片,也可以先对图片进行压缩再分享
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == RESULT_OK) {
//和上面一样,就是参数换了
builder.image(data.getData());
}
}
3 twitter分享回调
public class TwitterResultReceiver extends BroadcastReceiver {
private String UPLOAD_SUCCESS = "com.twitter.sdk.android.tweetcomposer.UPLOAD_SUCCESS";
private String UPLOAD_FAILURE = "com.twitter.sdk.android.tweetcomposer.UPLOAD_FAILURE";
private String TWEET_COMPOSE_CANCEL = "com.twitter.sdk.android.tweetcomposer.TWEET_COMPOSE_CANCEL";
@Override
public void onReceive(Context context, Intent intent) {
if (UPLOAD_SUCCESS.equals(intent.getAction())) {
// success Twitter分享成功的回调
} else if (UPLOAD_FAILURE.equals(intent.getAction())) {
// failure
} else if (TWEET_COMPOSE_CANCEL.equals(intent.getAction())) {
// cancel
}
}
}
4 AndroidManifest.xml
<!-- Twitter分享的接受广播 -->
<receiver
android:name="com.xnhd.japansdk.share.TwitterResultReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_SUCCESS" />
<action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_FAILURE" />
<action android:name="com.twitter.sdk.android.tweetcomposer.TWEET_COMPOSE_CANCEL" />
</intent-filter>
</receiver>
<meta-data android:name="io.fabric.ApiKey" android:value="YOUR_API_KEY"/>
经过验证,这个key可以随便,但一定要有
Twitter这个分享回调好像没什么卵用!!!
四 工具类
public class BitmapUtil {
// 压缩图片
public static Bitmap getBitmap(Bitmap imageBitmp) {
try {
Bitmap newBitmap = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
imageBitmp.compress(CompressFormat.JPEG, 30, baos);
byte[] bytes = baos.toByteArray();
newBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Log.i("wechat", "压缩后图片的大小" + (newBitmap.getByteCount() / 1024 / 1024) + "宽度为" + newBitmap.getWidth() + "高度为"
+ newBitmap.getHeight() + "bytes.length= " + (bytes.length / 1024) + "KB");
return newBitmap;
} catch (Exception e) {
e.printStackTrace();
}
return imageBitmp;
}
}
public class URIUtil {
/**
* 绝对路径转uri
*
* @param context
* @param imageFile
* @return content Uri
*/
public static Uri getImageContentUri(Context context, java.io.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);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
}
五 如果想分享网络图片(http://)这样的,可以用工具将图片下载到本地,不过一般接入好像没有分享网络图片的,哈哈哈
jar,网络上很多,分享到此结束!!!