Android 编程之第三方开发 MaoZhuaWeiBo微博开发演示样例-1「建议收藏」

2022-07-07 20:03:54 浏览数 (1)

大家好,又见面了,我是全栈君。

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

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

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

进入正题吧

开发前准备:

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

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

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

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

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

代码语言:javascript复制
    <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

代码语言:javascript复制
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之后将会贴上来

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

抓取成功:

代码语言:javascript复制
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() "最新动态:nn");          		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我还没有做不论什么拓展。只是我前面说到的的天气预报和文件管理器能够嵌入进来,能够解决掉一半,有兴趣的能够继续写下去,还有附近功能,我有时间会把它写了,贴出来,供大家学习

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

代码语言:javascript复制
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与凭证不匹配的情况下,能够卸载应用,或者将凭证刷新,就可以解决失效与不匹配的问题了。好了,第一篇就到这吧!

谢谢~~

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116333.html原文链接:https://javaforall.cn

0 人点赞