使用share SDK实现人人网授权登录分享(1.x版本)
来源:互联网 发布:st单片机代理 编辑:程序博客网 时间:2024/05/15 09:39
操作步骤:
1、在share官网注册应用生成AppKey并下载SDK 网址:http://www.shareSDK.cn
2、在人人网平台注册应用生成AppId和AppKey 网址:http://dev.renren.com
3、导入SDK包。只实现人人网授权登录分享的话只需要导入ShareSDK-Core.jar(核心包)、ShareSDK-Renren.jar(人人网)、cn.sharesdk.onekeyshare.jar(快捷分享)
4、配置:需要配置AndroidManifest.xml和assets里面的ShareSDKDevInfor.xml和(后面有示例介绍)
5、添加代码实现登录、获取信息、分享等功能(见下面示例)。
ShareSDKDevInfor.xml:
<?xml version="1.0" encoding="utf-8"?><DevInfor> <!-- 说明: 1、表格中的第一项 <ShareSDK AppKey="api20" /> 是必须的,其中的AppKey是你在Share SDK上注册的开发者帐号的AppKey 2、所有集成到你项目的平台都应该为其在表格中填写相对应的开发者信息,以新浪微博为例: <SinaWeibo SortId="此平台在分享列表中的位置,由开发者自行定义,可以是任何整型数字,数值越大越靠后" AppKey="填写你在新浪微博上注册的AppKey" AppSecret="填写你在新浪微博上注册到的AppKey" Id="自定义字段,整形,用于你项目中对此平台的识别符" RedirectUrl="填写你在新浪微博上注册的RedirectUrl" /> 各个平台注册应用信息的地址如下: 新浪微博:http://open.weibo.com腾讯微博:http://dev.t.qq.comQQ空间:http://connect.qq.com/intro/login/网易微博:http://open.t.163.com搜狐微博:http://open.t.sohu.com豆瓣:http://developers.douban.com人人网:http://dev.renren.com开心网:http://open.kaixin001.comInstapaper:http://www.instapaper.com/main/request_oauth_consumer_token有道云笔记:http://note.youdao.com/open/developguide.html#appfacebook:https://developers.facebook.comtwitter:https://dev.twitter.com搜狐随身看:https://open.sohu.comQQ好友分享:http://mobile.qq.com/api/微信:http://open.weixin.qq.com --> <ShareSDK AppKey="123d2e98bef8" /> <!-- AppKey="104972cdd48" "23a9371d3a8" --> <Renren ApiKey="fc5b8aed373c4c27a05b712acba0f8c3" AppId="226427" Id="1" SecretKey="f29df781abdd4f49beca5a2194676ca4" SortId="1" /></DevInfor>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.home.renren" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.home.renren.LoginActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.home.renren.MainActivity" /> <activity android:name="com.home.renren.ShowInfoActivity" /> <!-- share SDK 里面的组件 --> <activity android:name="cn.sharesdk.framework.AuthorizeActivity" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="stateHidden|adjustResize" > </activity> <activity android:name="cn.sharesdk.onekeyshare.ShareAllGird" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="adjustPan|stateHidden" /> <activity android:name="cn.sharesdk.onekeyshare.SharePage" android:configChanges="keyboardHidden|orientation" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden|adjustResize" /> </application></manifest>
登录LoginActivity:
package com.home.renren;import java.util.HashMap;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Handler.Callback;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;import cn.sharesdk.framework.AbstractWeibo;import cn.sharesdk.framework.WeiboActionListener;import cn.sharesdk.renren.Renren;public class LoginActivity extends Activity implements WeiboActionListener,Callback {private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login);AbstractWeibo.initSDK(this);handler = new Handler(this);Button logionBtn = (Button) findViewById(R.id.login_btn_renren);logionBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {AbstractWeibo weibo = AbstractWeibo.getWeibo(LoginActivity.this, Renren.NAME);weibo.setWeiboActionListener(LoginActivity.this);weibo.showUser(null);}});}@Overridepublic void onCancel(AbstractWeibo weibo, int arg1) {Message msg = new Message();msg.arg1 = 3;msg.obj = weibo;handler.sendMessage(msg);}@Overridepublic void onComplete(AbstractWeibo weibo, int arg1,HashMap<String, Object> arg2) {Message msg = new Message();msg.arg1 = 1;msg.obj = weibo;handler.sendMessage(msg);}@Overridepublic void onError(AbstractWeibo weibo, int arg1, Throwable t) {t.printStackTrace();Message msg = new Message();msg.arg1 = 2;msg.obj = weibo;handler.sendMessage(msg);}/** * 处理从授权页面返回的结果:异常则给出提示,正常则跳转页面 * */@Overridepublic boolean handleMessage(Message msg) {AbstractWeibo weibo = (AbstractWeibo) msg.obj;switch (msg.arg1) {case 1: { // 成功Toast.makeText(this, weibo.getName() + "授权成功", Toast.LENGTH_SHORT).show();}break;case 2: { // 失败Toast.makeText(this, weibo.getName() + "授权失败", Toast.LENGTH_SHORT).show();return false;}case 3: { // 取消Toast.makeText(this, weibo.getName() + "授权取消", Toast.LENGTH_SHORT).show();return false;}}Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);return false;}@Overrideprotected void onDestroy() {// 结束ShareSDK的统计功能并释放资源AbstractWeibo.stopSDK(this);super.onDestroy();}}
主界面MainActivity:
package com.home.renren;import java.io.File;import java.io.FileOutputStream;import java.util.HashMap;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Handler.Callback;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;import cn.sharesdk.framework.AbstractWeibo;import cn.sharesdk.framework.WeiboActionListener;import cn.sharesdk.onekeyshare.ShareAllGird;import cn.sharesdk.renren.Renren;public class MainActivity extends Activity implements OnClickListener,Callback, WeiboActionListener {private Button getInfoBtn;private Button noUIShareBtn;private Button hasUIShareBtn;private Button logoutBtn;private Handler handler;// 定义图片存放的地址public static String TEST_IMAGE;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);AbstractWeibo.initSDK(this);initWidget();initImage();}/** * 初始化UI相关组件 */private void initWidget() {getInfoBtn = (Button) findViewById(R.id.main_get_userinfo);noUIShareBtn = (Button) findViewById(R.id.main_share_noUI);hasUIShareBtn = (Button) findViewById(R.id.main_share_hasUI);logoutBtn = (Button) findViewById(R.id.main_btn_logout);getInfoBtn.setOnClickListener(this);noUIShareBtn.setOnClickListener(this);hasUIShareBtn.setOnClickListener(this);logoutBtn.setOnClickListener(this);handler = new Handler(this);}@Overridepublic void onClick(View v) {if (v == getInfoBtn) {AbstractWeibo weibo = AbstractWeibo.getWeibo(this, Renren.NAME);weibo.setWeiboActionListener(this);weibo.showUser(null);} else if (v == noUIShareBtn) {showGrid(true);} else if (v == hasUIShareBtn) {showGrid(false);} else if (v == logoutBtn) {// 注销AbstractWeibo weibo = AbstractWeibo.getWeibo(this, Renren.NAME);if (weibo.isValid()) {weibo.removeAccount();finish();}}}/** 处理操作结果 */public boolean handleMessage(Message msg) {switch (msg.arg1) {case 1: { // 成功Intent intent = new Intent(MainActivity.this,ShowInfoActivity.class);intent.putExtra("data", String.valueOf(msg.obj));startActivity(intent);}break;case 2: {// 失败AbstractWeibo weibo = (AbstractWeibo) msg.obj;Toast.makeText(this, weibo.getName() + "授权失败", Toast.LENGTH_SHORT).show();}break;case 3: {// 取消AbstractWeibo weibo = (AbstractWeibo) msg.obj;Toast.makeText(this, weibo.getName() + "授权取消", Toast.LENGTH_SHORT).show();}break;}return false;}/** * 初始化分享的本地图片 */private void initImage() {try {// 判断SD卡中是否存在此文件夹if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())&& Environment.getExternalStorageDirectory().exists()) {File baseFile = new File(Environment.getExternalStorageDirectory(), "share");if (!baseFile.exists()) {baseFile.mkdir();}TEST_IMAGE = baseFile.getAbsolutePath() + "/picture.png";} else {TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath()+ "/picture.png";}File file = new File(TEST_IMAGE);// 判断图片是否存此文件夹中if (!file.exists()) {file.createNewFile();Bitmap pic = BitmapFactory.decodeResource(getResources(),R.drawable.picture);FileOutputStream fos = new FileOutputStream(file);pic.compress(CompressFormat.JPEG, 100, fos);fos.flush();fos.close();}} catch (Throwable t) {t.printStackTrace();TEST_IMAGE = null;}}@Overridepublic void onCancel(AbstractWeibo weibo, int arg1) {Message msg = new Message();msg.arg1 = 3;msg.obj = weibo;handler.sendMessage(msg);}@Overridepublic void onComplete(AbstractWeibo arg0, int arg1,HashMap<String, Object> res) {Message msg = new Message();msg.arg1 = 1;JsonUtils ju = new JsonUtils();String json = ju.fromHashMap(res);msg.obj = ju.format(json);handler.sendMessage(msg);}@Overridepublic void onError(AbstractWeibo weibo, int arg1, Throwable arg2) {Message msg = new Message();msg.arg1 = 2;msg.obj = weibo;handler.sendMessage(msg);}/** * 使用快捷分享完成图文分享 * * @param silent * 是否直接分享 */private void showGrid(boolean silent) {Intent i = new Intent(this, ShareAllGird.class);// 分享时Notification的图标i.putExtra("notif_icon", R.drawable.ic_launcher);// 分享时Notification的标题i.putExtra("notif_title", this.getString(R.string.app_name));// title标题,在印象笔记、邮箱、信息、微信(包括好友和朋友圈)、人人网和QQ空间使用,否则可以不提供i.putExtra("title", this.getString(R.string.share));// titleUrl是标题的网络链接,仅在人人网和QQ空间使用,否则可以不提供i.putExtra("titleUrl", "http://sharesdk.cn");// text是分享文本,所有平台都需要这个字段i.putExtra("text", this.getString(R.string.share_content));// imagePath是本地的图片路径,所有平台都支持这个字段,不提供,则表示不分享图片i.putExtra("imagePath", MainActivity.TEST_IMAGE);// url仅在微信(包括好友和朋友圈)中使用,否则可以不提供i.putExtra("url", "http://sharesdk.cn");// thumbPath是缩略图的本地路径,仅在微信(包括好友和朋友圈)中使用,否则可以不提供i.putExtra("thumbPath", MainActivity.TEST_IMAGE);// appPath是待分享应用程序的本地路劲,仅在微信(包括好友和朋友圈)中使用,否则可以不提供i.putExtra("appPath", MainActivity.TEST_IMAGE);// comment是我对这条分享的评论,仅在人人网和QQ空间使用,否则可以不提供i.putExtra("comment", this.getString(R.string.share));// site是分享此内容的网站名称,仅在QQ空间使用,否则可以不提供i.putExtra("site", this.getString(R.string.app_name));// siteUrl是分享此内容的网站地址,仅在QQ空间使用,否则可以不提供i.putExtra("siteUrl", "http://sharesdk.cn");// 是否直接分享i.putExtra("silent", silent);this.startActivity(i);}@Overrideprotected void onResume() {super.onResume();AbstractWeibo.initSDK(this);}}
显示用户信息ShowInfoActivity:
package com.home.renren;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class ShowInfoActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.show_info);TextView show = (TextView) findViewById(R.id.show_info_tv);show.setText(getIntent().getStringExtra("data"));}}
工具类JsonUtils:
package com.home.renren;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Map.Entry;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;public class JsonUtils {/** * 将指定的json数据转成 HashMap<String, Object>对象 */public HashMap<String, Object> fromJson(String jsonStr) {try {if (jsonStr.startsWith("[") && jsonStr.endsWith("]")) {jsonStr = "{\"fakelist\":" + jsonStr + "}";}JSONObject json = new JSONObject(jsonStr);return fromJson(json);} catch (Throwable t) {t.printStackTrace();}return new HashMap<String, Object>();}private HashMap<String, Object> fromJson(JSONObject json)throws JSONException {HashMap<String, Object> map = new HashMap<String, Object>();@SuppressWarnings("unchecked")Iterator<String> iKey = json.keys();while (iKey.hasNext()) {String key = iKey.next();Object value = json.opt(key);if (JSONObject.NULL.equals(value)) {value = null;}if (value != null) {if (value instanceof JSONObject) {value = fromJson((JSONObject) value);} else if (value instanceof JSONArray) {value = fromJson((JSONArray) value);}map.put(key, value);}}return map;}private ArrayList<Object> fromJson(JSONArray array) throws JSONException {ArrayList<Object> list = new ArrayList<Object>();for (int i = 0, size = array.length(); i < size; i++) {Object value = array.opt(i);if (value instanceof JSONObject) {value = fromJson((JSONObject) value);} else if (value instanceof JSONArray) {value = fromJson((JSONArray) value);}list.add(value);}return list;}/** * 将指定的HashMap<String, Object>对象转成json数据 */public String fromHashMap(HashMap<String, Object> map) {try {return getJSONObject(map).toString();} catch (Throwable t) {t.printStackTrace();}return "";}@SuppressWarnings("unchecked")private JSONObject getJSONObject(HashMap<String, Object> map)throws JSONException {JSONObject json = new JSONObject();for (Entry<String, Object> entry : map.entrySet()) {Object value = entry.getValue();if (value instanceof HashMap<?, ?>) {value = getJSONObject((HashMap<String, Object>) value);} else if (value instanceof ArrayList<?>) {value = getJSONArray((ArrayList<Object>) value);}json.put(entry.getKey(), value);}return json;}@SuppressWarnings("unchecked")private JSONArray getJSONArray(ArrayList<Object> list) throws JSONException {JSONArray array = new JSONArray();for (Object value : list) {if (value instanceof HashMap<?, ?>) {value = getJSONObject((HashMap<String, Object>) value);} else if (value instanceof ArrayList<?>) {value = getJSONArray((ArrayList<Object>) value);}array.put(value);}return array;}/** * 格式化一个json串 */public String format(String jsonStr) {try {return format("", fromJson(jsonStr));} catch (Throwable t) {t.printStackTrace();}return "";}@SuppressWarnings("unchecked")private String format(String sepStr, HashMap<String, Object> map) {StringBuffer sb = new StringBuffer();sb.append("{\n");String mySepStr = sepStr + "\t";int i = 0;for (Entry<String, Object> entry : map.entrySet()) {if (i > 0) {sb.append(",\n");}sb.append(mySepStr).append('\"').append(entry.getKey()).append("\":");Object value = entry.getValue();if (value instanceof HashMap<?, ?>) {sb.append(format(mySepStr, (HashMap<String, Object>) value));} else if (value instanceof ArrayList<?>) {sb.append(format(mySepStr, (ArrayList<Object>) value));} else if (value instanceof String) {sb.append('\"').append(value).append('\"');} else {sb.append(value);}i++;}sb.append('\n').append(sepStr).append('}');return sb.toString();}@SuppressWarnings("unchecked")private String format(String sepStr, ArrayList<Object> list) {StringBuffer sb = new StringBuffer();sb.append("[\n");String mySepStr = sepStr + "\t";int i = 0;for (Object value : list) {if (i > 0) {sb.append(",\n");}sb.append(mySepStr);if (value instanceof HashMap<?, ?>) {sb.append(format(mySepStr, (HashMap<String, Object>) value));} else if (value instanceof ArrayList<?>) {sb.append(format(mySepStr, (ArrayList<Object>) value));} else if (value instanceof String) {sb.append('\"').append(value).append('\"');} else {sb.append(value);}i++;}sb.append('\n').append(sepStr).append(']');return sb.toString();}}
login.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal"> <Button android:id="@+id/login_btn_renren" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="人人网授权登录" /></LinearLayout>
main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/main_get_userinfo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取用户信息" /> <Button android:id="@+id/main_share_noUI" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="分享(无界面)" /> <Button android:id="@+id/main_share_hasUI" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="分享(有界面)" /> <Button android:id="@+id/main_btn_logout" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注销登录" /></LinearLayout>
show_info.xml:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" > <TextView android:id="@+id/show_info_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginRight="10dp" android:autoLink="all" android:textColor="#ff000000" /> </ScrollView></RelativeLayout>
strings:
<string name="share_content">测试使用shareSDK进行分享,感觉还不错,使用方便,功能强大!</string> <string name="share">分享</string>
0 0
- 使用share SDK实现人人网授权登录分享(1.x版本)
- 使用share SDK实现人人网授权登录分享(1.x版本)
- 使用share SDK实现QQ空间授权登录、分享(1.x版本)
- 使用share SDK实现腾讯微博授权登录分享(1.x版本)
- 使用share SDK实现新浪微博授权登录分享(1.x版本)
- 使用share SDK实现QQ空间授权登录、分享(1.x版本)
- 使用share SDK实现腾讯微博授权登录分享(1.x版本)
- 使用share SDK实现新浪微博授权登录分享(1.x版本)
- 有奖试读 使用share SDK实现腾讯微博授权登录分享(1.x版本)
- 使用share SDK实现QQ空间授权登录、分享(1.x版本)
- 使用share SDK实现第三方授权登录、分享综合(2.x版本)
- 使用share SDK实现第三方授权登录、分享综合(2.x版本)
- 使用Share Sdk 实现第三方登录和分享
- 使用Share Sdk 实现第三方登录和分享
- share SDK 导入实现第三方登录和分享
- Unity使用Share-SDK接微信登录和分享的总结(Android)
- android 第三方平台登录与分享(基于Share SDK)
- ShareSDK实现授权登录和分享功能
- C#之重构与重载
- RESTful架构风格
- Spring MVC获取客户端传给的json数据
- 【设计模式-外观模式】facade模式
- POJ 1743 后缀数组+分组二分
- 使用share SDK实现人人网授权登录分享(1.x版本)
- SQLQuery接口addScalar方法
- JSONObject与JSONArray的使用
- ORA-03113 ORA-27103: internal error MMAN (ospid: 21061)
- JAVA--将二进制流转换成图片文件
- 导致电脑网速变慢的几个方面
- JS把字符串按照特定的字母顺序进行排序
- Objc中Block的原理、实现及注意事项
- P2P的原理和常见的实现方式