当前位置:  编程技术>移动开发
本页文章导读:
    ▪腾讯微博受权登陆超简单示例(源自官方Demo)        腾讯微博授权登陆超简单示例(源自官方Demo) 本人初学乍练 有什么不合适的地方欢迎大家踊跃吐槽首先参考官方API文档 了解腾讯微博Oauth2.0形式的授权过程这次主要将的是(code模式)方式的.........
    ▪ GridView分页加载-给GridView添FooterView        GridView分页加载--给GridView加FooterView 在项目开发中发现gridview不像listview一样可以加个footerview来显示加载状态。为达到像listview一样的加载效果,可以给gridview伪造一个footerview.核心思想是在绑.........
    ▪ 解决高德A地图(V2.0.2)官方Demo,找不到MAMapKit.h,MASeach.h有关问题       解决高德Amap(V2.0.2)官方Demo,找不到MAMapKit.h,MASeach.h问题 2,原本以为,打开demo后直接就能在模拟器上运行,谁知道直接就报错了,我们看一下错误: 3,下载API开发包 http://api.amap.com/Ios/downloa.........

[1]腾讯微博受权登陆超简单示例(源自官方Demo)
    来源: 互联网  发布时间: 2014-02-18
腾讯微博授权登陆超简单示例(源自官方Demo)
本人初学乍练 有什么不合适的地方欢迎大家踊跃吐槽

首先参考官方API文档 了解腾讯微博Oauth2.0形式的授权过程
这次主要将的是(code模式)方式的鉴权
http://wiki.open.t.qq.com/index.php/API%E6%96%87%E6%A1%A3

了解大致过程后 下载官方SDK
我使用的是Java SDK
http://wiki.open.t.qq.com/index.php/SDK%E4%B8%8B%E8%BD%BD#Java_SDK

将官方SDK添加到项目中
在项目名上右击 Build Path->Add External Archives...选择要添加的jar文件


首先生成鉴权URL
	/**
	 * 生成腾讯微博授权URL
	 * @param request
	 * @param m
	 * @return
	 * @throws IOException
	 */
	@RequestMapping(value = "/tencent/loginV2", method = RequestMethod.GET)
	public String tencentLogin(HttpServletRequest request, Model m) throws IOException {
		
					String url = "http://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=你申请的App Key&redirect_uri=回调地址&response_type=code";//
					return "redirect:" + url;


	}



上一步生成了授权URL 会自动引导你到填写微博账户的登录页面 填写完成 验证通过后 会回调到你刚才提交的redirect_uri地址

	/**
	 * 腾讯微博登录成功后的回调地址
	 * @param code 用来换取accesstoken的授权码,有效期为10分钟
	 * @param openid 用户统一标识,可以唯一标识一个用户
	 * @param openkey 与openid对应的用户key,是验证openid身份的验证密钥
	 * @param oAuthV2
	 * @param request
	 * @param response
	 * @param model
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/tencent/loginV2/callback", method = RequestMethod.GET)
	public String tencentLoginCallback(String code, String openid, String openkey,
			OAuthV2 oAuthV2,//2.0
			HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
		
     	 //设置授权 直接将授权码的参数记录到OAuth类中
		 if ((!QStrOperate.hasValue(code)) ||
                (!QStrOperate.hasValue(openid)) ||
                (!QStrOperate.hasValue(openkey))) {
			 return EnumErrorCode.ERROR_404.getValue();
         }
		 oAuthV2.setAuthorizeCode(code);
		 oAuthV2.setOpenid(openid);
		 oAuthV2.setOpenkey(openkey);
		 
		 oAuthV2.setClientId("申请时得到的AppKey");
		 oAuthV2.setClientSecret("申请时得到的AppSecret");//大家可自行到腾讯微博开放平台申请
		 oAuthV2.setRedirectUri("http://localhost/tencent/loginV2/callback");
		 oAuthV2.setGrantType("authorization_code");
		 
         //检查是否取得code
         if(!QStrOperate.hasValue(oAuthV2.getAuthorizeCode())){
        	 oAuthV2.setStatus(2);
         	 return EnumErrorCode.ERROR_404.getValue();
         }else
        	 oAuthV2.setStatus(0);//没有出错
        
        //访问Token
        String url = "https://open.t.qq.com/cgi-bin/oauth2/access_token";
        String queryString = QStrOperate.getQueryString(oAuthV2.getAccessTokenByCodeParamsList());
        
        //请求accesstoken 
        String responseData = Q_HTTP_CLIENT.httpGet(url, queryString);
        
        //将服务器返回的包含access token等的回应包  解析存储到OAuth类中
        if (!parseAccessToken(responseData, oAuthV2)) {// Access Token 授权不通过
        	oAuthV2.setStatus(3);
        	return EnumErrorCode.ERROR_404.getValue();
        }
        //回调时可debug查看是否获得access token 下面为常用调用API测试方法
        //    	String response1;
//        String format="json";
//        String clientip="127.0.0.1";
//        String jing ="";
//        String wei ="";
//        String syncflag="";
//        String content="2";// 注意:因为后台会对微博内容进行判重,所以在重复测试时加上变换部分++++++++
//        String reid=null;
//	    String ids=null;
//	    String id=null;
//        String picpath=System.getProperty("user.dir")+"\\src\\main\\resources\\logo_QWeibo.jpg";
//        
//        TAPI tAPI=new TAPI(oAuthV2.getOauthVersion());//根据oAuth配置对应的连接管理器
//        //取得返回结果
//        response1=tAPI.add(oAuthV2, format, "测试发表文字微博"+content, clientip, jing, wei, syncflag);
//             // json数据使用
//             // response的结果可能是这样,{"data":{"id":"90221131024999","time":1333002978},"errcode":0,"msg":"ok","ret":0}
//             // 下面的代码将取出 id 的对应值,并赋予 reid
//            System.out.println("response = "+response1);
//            JSONObject responseJsonObject;
//            JSONObject dataJsonObject;
//            responseJsonObject= JSONObject.fromObject(response1);
//            dataJsonObject=(JSONObject)responseJsonObject.get("data");
//            id=ids=reid=dataJsonObject.get("id").toString();//对后面用到的 reid 赋值
//            System.out.println("reid = "+ reid);
//        try { Thread.sleep ( 5000 ) ; } catch (InterruptedException ie){}
//        
//        tAPI.addPic(oAuthV2, format, "发表一条带本地图片的微博"+content, clientip, jing, wei, picpath, syncflag);
//        try { Thread.sleep ( 5000 ) ; } catch (InterruptedException ie){}
//        
//        tAPI.addVideo(oAuthV2, format, "发表视频微博"+content, clientip, jing, wei, "http://www.tudou.com/programs/view/yx41TA6rQfE/?resourceId=0_03_05_07", syncflag);
//        try { Thread.sleep ( 5000 ) ; } catch (InterruptedException ie){}


		return "redirect:/";
	}

    /**
     * 得到服务器返回的包含access token等的回应包后,解析存储到OAuth类中
     * 
     * @param responseData 格式:access_token=ACCESS_TOKEN&expires_in=60&name=NAME
     * @param oAuth
     * @return
     */
     public  static boolean parseAccessToken(String responseData, OAuthV2 oAuth){
        if (!QStrOperate.hasValue(responseData)) {
            return false;
        }

        oAuth.setMsg(responseData);
        String[] tokenArray = responseData.split("&");
        
        if (tokenArray.length < 2) {
            return false;
        }
        
        String tmpStr;
        for(int i=0;i<tokenArray.length;i++){
            if (tokenArray[i].startsWith("access_token=")){
                tmpStr=tokenArray[i].substring(tokenArray[i].indexOf('=')+1, tokenArray[i].length());
                if(!QStrOperate.hasValue(tmpStr)){
                    return false;
                }
                oAuth.setAccessToken(tmpStr);
            }
            if (tokenArray[i].startsWith("expires_in=")){
                tmpStr=tokenArray[i].substring(tokenArray[i].indexOf('=')+1, tokenArray[i].length());
                if(!QStrOperate.hasValue(tmpStr)){
                    return false;
                }
                oAuth.setExpiresIn(tmpStr);
            }
        }
        
        return true;
    }


如果成功发送了微博 说明授权成功

写的比较仓促 鉴于本人也是初次接触 如果有什么不妥的地方欢迎大家吐槽

下面附上官方Demo
1 楼 anglemoshao 18 小时前  
点错了,踩上了,挺好的
2 楼 houzhe11 18 小时前  
不错,,学习中
http://www.331king.com/JForum

    
[2] GridView分页加载-给GridView添FooterView
    来源: 互联网  发布时间: 2014-02-18
GridView分页加载--给GridView加FooterView

在项目开发中发现gridview不像listview一样可以加个footerview来显示加载状态。为达到像listview一样的加载效果,可以给gridview伪造一个footerview.核心思想是在绑定的list末加个null值,在getview的时候判断当前adapter是否要加footerview.

 

1、初始化GridView.在GridView滑到底时加载数据

	private void initGridView() {
		adapter = new ItemAdapter(MainActivity.this, list);
		adapter.setOnFooterViewClickListener(MainActivity.this);
		gridview.setAdapter(adapter);
		gridview.setOnScrollListener(new OnScrollListener() {

			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {

				if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
					if (view.getLastVisiblePosition() == (view.getCount() - 1)
							&& !isLoadFinished
							&& adapter.getFooterView().getStatus() != FooterView.LOADING) {
						loadMoreData();

					}
				}

			}

			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {

			}
		});
	}

 2、分页加载完数据处理

	@Override
	public void onCompletedSucceed(List<String> l) {

		// 在添加数据之前删除最后的伪造item
		if (adapter.isFooterViewEnable()) {
			list.remove(list.get(list.size() - 1));
		}

		// 分页加载
		if (l.size() < PAGE_SIZE || list.size() + l.size() == COUNT) {
			// 如果加载出来的数目小于指定条数,可视为已全部加载完成
			isLoadFinished = true;
			list.addAll(l);
			adapter.setFootreViewEnable(false);
			adapter.notifyDataSetChanged();
		} else {
			// 还有数据可加载。
			list.addAll(l);
			// 伪造一个空项来构造一个footerview;
			list.add(null);
			adapter.setFootreViewEnable(true);
			adapter.notifyDataSetChanged();
		}

	}

 3、adapter中的处理

 

public class ItemAdapter extends BaseAdapter {

	private List<String> mList = new ArrayList<String>();
	private Context mContext;

	private FooterView footerView;

	private boolean footerViewEnable = false; 
	private OnClickListener ml;

	public ItemAdapter(Context context, List<String> list) {
		if (list != null) {
			this.mList = list;
		}
		this.mContext = context;

	}

	public boolean isFooterViewEnable() {
		return footerViewEnable;
	}

	/**
	 * 存放列表项控件句柄
	 */
	public static class ViewHolder {

		public TextView itemview;

	}

	public void setFootreViewEnable(boolean enable) {
		footerViewEnable = enable;
	}

	public void setOnFooterViewClickListener(OnClickListener l) {
		ml = l;
	}

	private int getDisplayWidth(Activity activity) {
		Display display = activity.getWindowManager().getDefaultDisplay();
		int width = display.getWidth();
		return width;
	}

	@Override
	public View getView(final int i, View convertView, ViewGroup parent) {
		// footerViewEnable 判断当前是否要加footerview
		if (footerViewEnable && i == mList.size() - 1) {
			if (footerView == null) {
				footerView = new FooterView(parent.getContext());
				// 若 gridview是多列的,footerview的宽度要设置成固定数值,不能是fill_parent
				GridView.LayoutParams pl = new GridView.LayoutParams(
						getDisplayWidth((Activity) mContext),
						LayoutParams.WRAP_CONTENT);
				footerView.setLayoutParams(pl);
				footerView.setOnClickListener(new OnClickListener() {

					@Override
					public void onClick(View v) {
						if (ml != null) {
							ml.onClick(v);
						}

					}
				});
			}
			setFooterViewStatus(FooterView.MORE);
			return footerView;
		}

		final ViewHolder holder;
		// 当convertView是footerView时要重新加载view.
		if (convertView == null
				|| (convertView != null && convertView == footerView)) {

			convertView = LayoutInflater.from(mContext).inflate(
					R.layout.textview, parent, false);
			holder = new ViewHolder();
			holder.itemview = (TextView) convertView
					.findViewById(R.id.textview);

			convertView.setTag(holder);

		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.itemview.setText("item" + mList.get(i));
		return convertView;
	}

	public FooterView getFooterView() {
		return footerView;
	}

	public void setFooterViewStatus(int status) {
		if (footerView != null) {
			footerView.setStatus(status);
		}
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mList.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

}

 完整demo地址:https://github.com/hyhe/gridview-with-footerview.git


    
[3] 解决高德A地图(V2.0.2)官方Demo,找不到MAMapKit.h,MASeach.h有关问题
    来源: 互联网  发布时间: 2014-02-18
解决高德Amap(V2.0.2)官方Demo,找不到MAMapKit.h,MASeach.h问题
Amap最新版的API,运行官方demo报错:library not found for -lMAMapKit库找不到,我还沿用着1.4的API呢,于是在官网下载最新的2D/3D API跑一下demo,以下是遇到的一些问题,希望能给新来的同学一些引导。



开发环境:Xcode4.6(4.5以上大致都一样) 模拟器:5.0X以上(以下的没测试)

 

Amap版本:v2.0.2 下载地址:http://api.amap.com/Ios/download



1,下载AMap_iOS_API_Demo_V2.0.2.zip 解压后,打开release文件夹,有一个2Ddemo和一个3Ddemo,我们暂且打开2D的demo吧。

 

2,原本以为,打开demo后直接就能在模拟器上运行,谁知道直接就报错了,我们看一下错误:
 
找了半天,也没在demo里看到有关这个的头文件,那么,这就暗示我们得从官网下载静态库文件,导入到demo里。

 

3,下载API开发包 http://api.amap.com/Ios/download  
解压后看到文件夹下:
 
根目录2d文件夹下的headers文件夹里是我们想要的MAMapKit.h等头文件,Resources里是AMap.bundle资源文件,libMAMapKit.a就是编译时用到的静态库文件(3d同样)
根目录search文件夹下的headers里是我们使用搜索功能要用到的MASeach.h等头文件,同样也有一个libMASearchKit.a搜索专用的静态库文件。

 

4,我们首先把2d里的headers拷贝到工程下,如下图所示:
 

 

5,编译运行,发现没有MAMapKit.h file no found 的错误了,可是MASearchKit.h文件又找不到了,于是继续打开search文件夹,把headers里的4个.h文件拷贝到工程headers下,同上。(记得拷贝时要Add to targets)



6,再次编译运行,发现没有.h文件找不到的错误了,可是又有了:library not found for -lMAMapKit的错误,这个错误在我们自己导入开发包时也经常遇到,意思就是找不到这个库文件(.a文件),哪么我们继续在2d文件夹下看到了libMAMapKit.a,就是他了,同上一样,导入运行之。



7,再来编译,又发现了-lMASearchKit的错误,如下图:
 
继续在search文件夹下把libMASearchKit.a的文件导入。



8,再来运行,没有错误了,但是我建议把Resources文件夹里的AMap.bundle导入到工程下,这个文件是地图自带的一些图片资源,也没多大。

 

后记:
这个只是官方demo,其实自己建立的项目,也一样是这个道理,当你遇到这些错误的时候,知道是那里的错误,就可以了,无非是我们自己的项目,需要自己添加一些变量:
 



展示一张运行图吧:
 
新的API吹出框终于变了,左下角的logo也变了,终于有些美感了,相信高德AMap会越来越完善。

@http://bbs.lwxshow.com/forum.php?mod=viewthread&tid=260​


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3