您的位置:首页 > 移动开发 > Android开发

Android 编程之第三方开发 MaoZhuaWeiBo微博开发演示样例-1

2016-01-13 20:54 489 查看
在大学期间我做过非常多类似这种APP。这个是我们小组之前做的,我后期增加非常多新元素。完好了这个应用,由于为了加强

专业技术嘛。也是常常熬夜写些小东西,嘿嘿。只是还算不错。起码技术长进了不少嘛,还是非常欣慰的,今天给大家说说腾讯

微博第三方拓展client开发。说白了就是调用第三方接口的开放平台进行二次开发,跟微信有些类似吧,好了,不扯了。立即

进入正题吧

开发前准备:

① 腾讯QQ号(相信大家都有) ②腾讯微博 App key (申请地址:http://dev.t.qq.com/) ③API地址:http://wiki.open.t.qq.com/index.php/API%E6%96%87%E6%A1%A3

可能有些人会问。为什么不用新浪微博开发呢? 我就这么说吧,新浪的审核超慢。。

。等审核下来,预计咱们早就写完了


然后就開始着手我们的微博撰写了,把基本的架子搭好,我个人感觉先功能在UI比較好。由于UI后写的话,能够相对降低工作量,由于主要核心还是在功能,而UI是给用户不同的视觉体验吧

创建好Project之后,先给咱们的清单文件xml载入权限代码:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


接下来就是应用程序启动Activity,LoginActivity

package com.neweriweibo.activity;
/**
* 登录
* @author Engineer-Jsp
* @date 2014.10.29*/
import java.util.ArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.neweriweibo.MainActivity;
import com.neweriweibo.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class LoginActivity extends Activity {

private int[] mimageIds;
private String[] titles;
private ArrayList<ImageView> mimage;
private ViewPager mvp;
private MyAdapter madapter;
private TextView mtitle;
private ArrayList<View> mdots;
private int oldPosition = 0; // 记录上一次点的位置\
private int currentItem; // 当前页面

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.fristpager);

getActionBar().hide();
// 图片
mimageIds = new int[] { R.drawable.aa, R.drawable.bb, R.drawable.cc,
R.drawable.dd, };
// 图标标题
titles = new String[] { "随时随地分享你的信息", "不要一个人说话。", "不要默默的去快乐",
"让世界聆听你的心声" };

mimage = new ArrayList<ImageView>();
for (int i = 0; i < mimageIds.length; i++) {
ImageView imageview = new ImageView(this);
imageview.setBackgroundResource(mimageIds[i]);

mimage.add(imageview);
}

mdots = new ArrayList<View>();

mdots.add(findViewById(R.id.dot_0));
mdots.add(findViewById(R.id.dot_1));
mdots.add(findViewById(R.id.dot_2));
mdots.add(findViewById(R.id.dot_3));

mtitle = (TextView) findViewById(R.id.title);

mtitle.setText(titles[0]);

mvp = (ViewPager) findViewById(R.id.vp);

madapter = new MyAdapter();
mvp.setAdapter(madapter);

mvp.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int position) {

mtitle.setText(titles[position]);

mdots.get(oldPosition).setBackgroundResource(
R.drawable.dot_normarl);
mdots.get(position).setBackgroundResource(
R.drawable.dot_focused);
oldPosition = position;
// 记录下当前界面的位置:(线程的使用)
currentItem = position;
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {

}

@Override
public void onPageScrollStateChanged(int arg0) {

}
});
}

class MyAdapter extends PagerAdapter {

@Override
public int getCount() {

return mimage.size();
}

/* 推断是否是同一张图片 */
@Override
public boolean isViewFromObject(View arg0, Object arg1) {

return arg0 == arg1;
}

@Override
public Object instantiateItem(ViewGroup view, int position) {

view.addView(mimage.get(position));
return mimage.get(position);

}

@Override
public void destroyItem(ViewGroup view, int position, Object object) {

// super.destroyItem(container, position, object);
view.removeView(mimage.get(position));
// view.removeViewAt(position);
}
}

@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
// 线程池
ScheduledExecutorService sched = Executors
.newSingleThreadScheduledExecutor();
sched.scheduleWithFixedDelay(new ViewPagerTask(), 3, 3,
TimeUnit.SECONDS);
}

/* 任务切换图片 */
private class ViewPagerTask implements Runnable {

@Override
public void run() {

currentItem = (currentItem + 1) % mimageIds.length;
// 更新界面
handler.obtainMessage().sendToTarget();
}

}

private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
mvp.setCurrentItem(currentItem);
};
};

@Override
protected void onStop() {

super.onStop();
}

/*
* 进入微博主页或者验证授权
*/
public void login(View v){
//首选项抓凭证
String access_token = PreferenceManager.getDefaultSharedPreferences(this).getString("access_token", null) ;

if(null!=access_token){
// 不为空intent至主页
startActivity(new Intent(LoginActivity.this,MainActivity.class));
}else{
// 空至授权界面
startActivity(new Intent(LoginActivity.this,OAuthActivity.class));
}
}

}


由于我的IU写得太渣。。



布局文件就。

。。。有兴趣的话还是看源代码吧,讲完这个APP之后将会贴上来

以下说说凭证抓取的各自结果截图,代码:

抓取成功:

package com.neweriweibo;
/**
* 主活动
* @author Engineer-Jsp
* @date 2014.10.28
* */
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import com.neweriweibo.activity.SendMessageActivity;
import com.neweriweibo.adapter.MessageAdapter;
import com.neweriweibo.model.User;
import com.neweriweibo.model.UserWeiBiInfo;
import com.neweriweibo.service.UserService;
import com.squareup.picasso.Picasso;
import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SpinnerAdapter;
import android.widget.TextView;

public class MainActivity extends Activity  implements OnClickListener,OnNavigationListener{

public static String [] data;
private ShouYeFragment shouyeFragment ;
private MessageFragment messageFragment ;
private UserFragment userFragment ;
private SeacherFragment seacherFragment ;

private View mfristLayout ;
private View mmessageLayout ;
private View muserLayout ;
private View msousuoLayout ;

private ImageView shouyeImage ;
private ImageView messageImage ;
private ImageView userImage ;
private ImageView sousuoImage ;
private FragmentManager mfragmentManager ;

private SpinnerAdapter spinnerAdapter;
private List<String> dropData = null ;
private static int itemPosition = 0 ;
private String access_token;
private String openid;
private String openkey;
private static ListView lvMessage;
private static ArrayList<UserWeiBiInfo> userWeiBoData = null;
private static MessageAdapter messageAdapter;
//static  说明是静态的对象,能够直接用(类名.对象)来调用。

//Public与Private 是对象的訪问权限
//public(共同拥有)  说明不论什么类在不论什么地方都能调用它
//private(私有)  说明仅仅有在本类内被调用
public static User user ;
private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {

if(intent.getAction().endsWith("messagett")){

new TimeLineAsyncTask(MainActivity.this).execute() ;
messageAdapter.notifyDataSetChanged();
lvMessage.setAdapter(messageAdapter) ;
}else{

user = intent.getParcelableExtra(UserService.NOW_WEATHER) ;
Log.i("广播接收到的用户个人信息:", user.toString())  ;
}

}
};

@Override
protected void onStart() {
super.onStart();
registerReceiver(receiver, new IntentFilter("messagett"));
registerReceiver(receiver, new IntentFilter(UserService.UPDATA));

}

@Override
protected void onStop() {
super.onStop();
unregisterReceiver(receiver) ;
}

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView() ;

access_token = PreferenceManager.getDefaultSharedPreferences(this).getString("access_token", "access_token");
openid = PreferenceManager.getDefaultSharedPreferences(this).getString("openid", "openid");
openkey = PreferenceManager.getDefaultSharedPreferences(this).getString("openkey", "openkey");

Log.i("首选项保存的信息:","access_token :" + access_token+"\n"+ "openid :" + openid +"\n"+ "openkey :" + openkey );

new TimeLineAsyncTask(this).execute() ;

ActionBar actionBar = getActionBar() ;
actionBar.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.bg_btn_nor));
actionBar.setDisplayHomeAsUpEnabled(true) ;   //设置actionBar的图片的可见性

dropData = new ArrayList<String>() ;

dropData.add("我的微博") ;
dropData.add("好友圈") ;
dropData.add("周边微博") ;

spinnerAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_dropdown_item, dropData);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST) ;   //设置actionBar的模式
actionBar.setListNavigationCallbacks(spinnerAdapter, this);

mfragmentManager  = getFragmentManager();

setTabSelection(0) ;   //设置默认的Fragment选项

Intent intent = new Intent(this,UserService.class) ;
startService(intent) ;

}

/**
* 初始化控件
*/
private void initView() {

mfristLayout = findViewById(R.id.shouye_layout);
mmessageLayout = findViewById(R.id.message_layout);
muserLayout = findViewById(R.id.user_layout);
msousuoLayout = findViewById(R.id.sousuo_layout);

shouyeImage = (ImageView) findViewById(R.id.shouye_image);
messageImage = (ImageView) findViewById(R.id.message_image);
userImage = (ImageView) findViewById(R.id.user_image);
sousuoImage = (ImageView) findViewById(R.id.sousuo_image);

mfristLayout.setOnClickListener(this);
mmessageLayout.setOnClickListener(this);
muserLayout.setOnClickListener(this);
msousuoLayout.setOnClickListener(this);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {
case R.id.action_sendmessage:    //编写消息

Intent  intent  = new Intent(MainActivity.this,SendMessageActivity.class) ;
startActivity(intent);
break;

default:
break;
}

return super.onOptionsItemSelected(item);

}

private void setTabSelection(int index) {
clearSelection()   ;  //清除所选中的状态
FragmentTransaction _transaction = mfragmentManager.beginTransaction() ;
hideFragments(_transaction);     //隐藏碎片
switch (index) {
case 0:
// 当点击了消息tab时,改变控件的图片和文字颜色
shouyeImage.setImageResource(R.drawable.shouye01);
if (shouyeFragment == null) {
shouyeFragment = new ShouYeFragment() ;
_transaction.add(R.id.content, shouyeFragment);
} else {

_transaction.show(shouyeFragment);
}
break;
case 1:
// 当点击了联系人tab时,改变控件的图片和文字颜色

messageImage.setImageResource(R.drawable.xiaoxi01);

if (messageFragment == null) {

messageFragment = new MessageFragment();
_transaction.add(R.id.content, messageFragment);
} else {

_transaction.show(messageFragment);
}
break;
case 2:
// 当点击了动态tab时,改变控件的图片和文字颜色
userImage.setImageResource(R.drawable.yonghu01);

if (userFragment == null) {

userFragment = new UserFragment();
_transaction.add(R.id.content, userFragment);
} else {

_transaction.show(userFragment);
}
break;
case 3:
// 当点击了设置tab时,改变控件的图片和文字颜色
sousuoImage.setImageResource(R.drawable.chazhao01);
if (seacherFragment == null) {

seacherFragment = new SeacherFragment();
_transaction.add(R.id.content, seacherFragment);
} else {

_transaction.show(seacherFragment);
}

break ;
default:
break;
}
_transaction.commit();
}

private void hideFragments(FragmentTransaction _transaction) {

if (shouyeFragment != null) {
_transaction.hide(shouyeFragment);
}
if (messageFragment != null) {
_transaction.hide(messageFragment);
}
if (userFragment != null) {
_transaction.hide(userFragment);
}
if (seacherFragment != null) {
_transaction.hide(seacherFragment);
}

}

/*
*  用户清除点击进入界面所须要清除的全部状态
*/
private void clearSelection() {
shouyeImage.setImageResource(R.drawable.shouye) ;
messageImage.setImageResource(R.drawable.xiaoxi) ;
userImage.setImageResource(R.drawable.yonghu) ;
sousuoImage.setImageResource(R.drawable.chazhao) ;

}

/*
*  底部Fragment点击事件所相应页面的显示
* (non-Javadoc)
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v) {
int Fragmentid = v.getId() ;
switch (Fragmentid) {
case R.id.shouye_layout:
setTabSelection(0) ;
break;
case R.id.message_layout:
setTabSelection(1) ;
break;
case R.id.user_layout:
setTabSelection(2) ;
break;
case R.id.sousuo_layout:
setTabSelection(3) ;
break;
default:
break;
}

}

/**
* 异步载入微博消息
* @author Administrator
*
*/
private class TimeLineAsyncTask extends AsyncTask<Void, Void, ArrayList<UserWeiBiInfo>> {

Context context ;

public TimeLineAsyncTask(Context pcontext) {
context = pcontext ;
userWeiBoData = new ArrayList<UserWeiBiInfo>();
}

@Override
protected ArrayList<UserWeiBiInfo> doInBackground(Void... params) {

UserWeiBiInfo userWeiBo = null;
String json = "";
String url = "http://open.t.qq.com/api/statuses/home_timeline";
StringBuffer buff = new StringBuffer(url) ;
String path =  buff.append("?").append("format=json&pageflag=0&pagetime=0&reqnum=5&lastid=0&type=3&contenttype=0x80")
.append("&oauth_consumer_key=801506545").append("&access_token="+access_token).append("&openid="+openid)
.append("&clientip=CLIENTIP").append("&oauth_version=2.a").append("&scope=all").toString() ;

HttpGet get = new HttpGet(path);
HttpClient client = new DefaultHttpClient();

try {

HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
json = EntityUtils.toString(response.getEntity(), "utf-8");

JSONObject root = new JSONObject(json);
JSONObject data = root.getJSONObject("data");
Log.d("微博消息列表:", data.toString());
JSONArray info = data.getJSONArray("info");

for (int i = 0; i < info.length(); i++) {

userWeiBo = new UserWeiBiInfo();
JSONObject object = (JSONObject) info.get(i);
String id = object.getString("id");
String name = object.getString("name");
String origtext = object.getString("origtext");
String headimg = object.getString("head")+"/40";

userWeiBo.setId(id);
userWeiBo.setName(name);
userWeiBo.setOrigtext(origtext);
userWeiBo.setHeadimg(headimg);

Log.i("微博好友近期动态:", userWeiBo.toString());
userWeiBoData.add(userWeiBo);
}
}
} catch (Exception e) {
e.printStackTrace() ;
}

return userWeiBoData;
}

@Override
protected void onPostExecute(ArrayList<UserWeiBiInfo> result) {
super.onPostExecute(result);

messageAdapter = new MessageAdapter(context,result);
messageAdapter.notifyDataSetChanged();
}
}
public  static class ShouYeFragment extends Fragment{
private GridView gridview ;
private SimpleAdapter adapter;
private String[] text;
private int[]icon={R.drawable.icon_1,R.drawable.icon_2,R.drawable.icon_3,
R.drawable.icon_4,R.drawable.icon_5,R.drawable.icon_6};
private List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
text = getResources().getStringArray(R.array.array);
for(int i=0;i<text.length;i++){
Map<String,Object> map = new HashMap<String, Object>();
map.put("img", icon[i]);
map.put("name", text[i]);
list.add(map);
}
adapter = new SimpleAdapter(getActivity(), list, R.layout.log, new String[]{"img","name"}, new int []{R.id.g_icon,R.id.g_text});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_shouye, container, false) ;
gridview = (GridView)view.findViewById(R.id.gridView);

ImageView icon = (ImageView)view.findViewById(R.id.icon);//头像
TextView name = (TextView)view.findViewById(R.id.name);//昵称
TextView time = (TextView)view.findViewById(R.id.time);//时间
//
File file = new File(Environment.getExternalStorageDirectory()+"/"+"weiinfo") ;
BufferedReader reader = null ;
String line = null ;
try {
reader = new BufferedReader(new FileReader(file)) ;
line = reader.readLine() ;
} catch (Exception e) {
e.printStackTrace();
}
data = line.split("\\*") ;

Picasso.with(getActivity().getApplicationContext()).load(data[5]).into(icon);
name.setText(data[0]);
time.setText("Time");
gridview.setAdapter(adapter);
return view ;
}
}

public static class MessageFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_message, container, false) ;
lvMessage = (ListView)view.findViewById(R.id.lv_message);

messageAdapter = new MessageAdapter(getActivity(),userWeiBoData);
messageAdapter.notifyDataSetChanged();
lvMessage.setAdapter(messageAdapter) ;
return view ;
}
}

public static class UserFragment extends Fragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.user, container, false) ;

ImageView headimg2 = (ImageView)view.findViewById(R.id.head) ;   //头像2
TextView nick2 = (TextView)view.findViewById(R.id.nick2) ; // 昵称2
TextView nearinfo = (TextView)view.findViewById(R.id.nearinfo) ; // 用户近期的一条原创微博
ImageView headimg = (ImageView)view.findViewById(R.id.headimg) ;//用户头像上
TextView tvName = (TextView)view.findViewById(R.id.text1_nick) ;    //username称
TextView brith = (TextView)view.findViewById(R.id.text2_br) ;    //用户生日
TextView tv_location = (TextView)view.findViewById(R.id.location) ;    //用户地址
TextView usertitle = (TextView)view.findViewById(R.id.text3_info) ;    //用户资料
TextView fabiao = (TextView)view.findViewById(R.id.fabiao) ;    //微博数量
TextView shouting = (TextView)view.findViewById(R.id.shouting); //关注数
TextView tingzhong = (TextView)view.findViewById(R.id.tingzhong);// 被关注数
TextView sex = (TextView)view.findViewById(R.id.sex);// 性别 1-男。2-女,0-未填写
if(user!=null){
Picasso.with(getActivity().getApplicationContext()).load(user.getHeadimg()).into(headimg);
tvName.setText(user.getNick());
brith.setText(user.getBirthyeaer()+"/"+user.getBirthmonth()+"/"+user.getBirthday());
tv_location.setText(user.getLoacation());
usertitle.setText(user.getInfo());
tingzhong.setText(user.getFansnum());
shouting.setText(user.getIdonum());
fabiao.setText(user.getTweetnum());
sex.setText(user.getSex());
Picasso.with(getActivity().getApplicationContext()).load(user.getHeadimg()).into(headimg2);
nick2.setText(user.getNick()+"最新动态:\n\n");
nearinfo.setText(user.getNearinfo());
}else{

File file = new File(Environment.getExternalStorageDirectory()+"/"+"weiinfo") ;
BufferedReader reader = null ;
String line = null ;
try {
reader = new BufferedReader(new FileReader(file)) ;
line = reader.readLine() ;
} catch (Exception e) {
e.printStackTrace();
}
data = line.split("\\*") ;
Log.d("没有获取到网络抓取数据,载入本地文件:", "数组长度:"+data.length);
for(int i=0;i<data.length;i++){
Log.d("本地数据的排序:",i+":"+ data[i]);
}
tvName.setText(data[0]);  //昵称
nick2.setText(data[0]);
shouting.setText(data[1]);  //关注数
tv_location.setText(data[2]);//位置
brith.setText(data[3]);//生日
usertitle.setText(data[4]);//自我介绍
Picasso.with(getActivity().getApplicationContext()).load(data[5]).into(headimg);//头像
Picasso.with(getActivity().getApplicationContext()).load(data[5]).into(headimg2);
tingzhong.setText(data[6]);//粉丝数
fabiao.setText(data[7]);//微博数
sex.setText(data[8]);//性别
nearinfo.setText(data[9]);//近期动态
}
return view ;
}
}

public static class SeacherFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sousuo, container, false) ;
return view ;
}
}

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
MainActivity.itemPosition = itemPosition ;
return true;
}
}


结果图,个人信息界面,网络抓取。解析,没有网络时。保存了最后一次动态的数据在本地:






数据都是来自腾讯server的。不是本地的。首页界面:






这个GridView我还没有做不论什么拓展。只是我前面说到的的天气预报和文件管理器能够嵌入进来,能够解决掉一半,有兴趣的能够继续写下去,还有附近功能,我有时间会把它写了,贴出来,供大家学习

凭证抓取失败的结果,跳转至授权界面。授权成功,信息保存至首选项:

package com.neweriweibo.activity;
/**
* 授权
* @author Engineer-Jsp
* @date 2014.10.28
* */
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;

import com.neweriweibo.R;
import com.neweriweibo.MainActivity;
import com.neweriweibo.R.id;
import com.neweriweibo.R.layout;
import com.neweriweibo.utils.TencentAPI;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class OAuthActivity extends Activity {

private static final String TAG = "float" ;
private WebView webView;

@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.login_load);
webView = (WebView) findViewById(R.id.webview);
WebSettings webSetting = webView.getSettings() ;   //获取设置对象
webSetting.setJavaScriptEnabled(true);      //设置WebView 支持JavaScript

webView.setWebViewClient(mClient);

/**
* BasicNameValuePair实现了NameValuePair接口  :
*     String getName();
*     String getValue();
*/
List<BasicNameValuePair> _list  = new ArrayList<BasicNameValuePair>() ;

_list.add(new BasicNameValuePair("client_id",TencentAPI.client_id)) ;
_list.add(new BasicNameValuePair("redirect_uri",TencentAPI.redirectUri)) ;
_list.add(new BasicNameValuePair("response_type",TencentAPI.response_type)) ;

String param = URLEncodedUtils.format(_list, "utf-8") ;

webView.loadUrl(TencentAPI.url + "?" +param) ;          //载入授权登入界面
Log.d("授权地址:", TencentAPI.url+"?

"+param);

}
//:主要实现:获取access_token :access_token=789a7d5284d0c3e608f8e384c993d04b (授权码)
private WebViewClient mClient = new WebViewClient(){

public void onPageStarted(WebView view, String url, android.graphics.Bitmap favicon) {
Log.i("打印授权地址:", url) ;

/*
*  http://www.newer.com/#access_token=789a7d5284d0c3e608f8e384c993d04b&expires_in=8035200&openid=0027BC08DB5B45D7461E9A0F16F527E7&openkey=60A1DF40C01EE30537AF7739504DFDB0&refresh_token=5c768f8850ae5af2193ce79f3f0a1351&state=&name=cfloat656805&nick=Cfloat *  完毕之后会在你该应用的网址上返回授权server重定向浏览器到第三方应用的回调url(redirect_uri),
*  并附上code,openid和openkey等參数
*  http://www.newer.com/ *  #access_token=789a7d5284d0c3e608f8e384c993d04b
*  &expires_in=8035200
*  &openid=0027BC08DB5B45D7461E9A0F16F527E7
*  &openkey=60A1DF40C01EE30537AF7739504DFDB0
*  &refresh_token=5c768f8850ae5af2193ce79f3f0a1351
*  &state=
*  &name=cfloat656805
*  &nick=Cfloat
*/
if(url.startsWith(TencentAPI.redirectUri)){             //推断回调的Url前缀是否是你授权时给的url地址

/*截取:access_token=789a7d5284d0c3e608f8e384c993d04b
*     &expires_in=8035200
*     &openid=0027BC08DB5B45D7461E9A0F16F527E7
*     &openkey=60A1DF40C01EE30537AF7739504DFDB0
*     &refresh_token=5c768f8850ae5af2193ce79f3f0a1351
*     &state=
*     &name=cfloat656805
*     &nick=Cfloat
*/
String text = url.substring(url.indexOf("#")+1) ;
String[] params = text.split("&") ;

SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit() ;

for(String str : params){
Log.i("遍历正则取到的參数:", str+" ") ;

String[] KeyValue = str.split("=") ;  //切割

if(KeyValue.length == 2){
editor.putString(KeyValue[0], KeyValue[1]) ;
}

Log.i("存放到首选项的2个參数:", Arrays.toString(KeyValue)) ;

}

editor.commit() ;   //提交

startActivity(new Intent(getApplication(),MainActivity.class));
finish();   //结束
}

};

} ;

}


OK,前期的工作已经KO了,以下说说access_token凭证,他的有效时间是30天,假设出现key与凭证不匹配的情况下,能够卸载应用,或者将凭证刷新,就可以解决失效与不匹配的问题了。好了,第一篇就到这吧!

谢谢~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: