当前位置:  编程技术>移动开发
本页文章导读:
    ▪SharedPreferences存与取        SharedPreferences存与取,    android中常用有五种存储,今天记录的是最简单一种。就一个矿建里面有着变化不算大的几步。。。   所谓存储就是先存后取。1。先存:SharedPreferences set_choose = .........
    ▪ byte[]将图片变为字节存入流中,然后Bit地图将流读出,显示图片        byte[]将图片变为字节存入流中,然后Bitmap将流读出,显示图片   这几天遇到一个问题,绊住好长时间,为了以后有据可查,现在记录下来。问题:选中图片还会用在别的地方,所以先把图.........
    ▪ 施用基站、wifi实现定位       使用基站、wifi实现定位     转载请注明出处    android可以借助于gps实现定位,但是很多地方是使用gps无法定位比如在室内,而且gps定位的话速度慢。        那么如何克服这样的缺点.........

[1]SharedPreferences存与取
    来源: 互联网  发布时间: 2014-02-18
SharedPreferences存与取,
   android中常用有五种存储,今天记录的是最简单一种。就一个矿建里面有着变化不算大的几步。。。
   所谓存储就是先存后取。
1。先存:
SharedPreferences set_choose = getSharedPreferences(PHONE_PREF,0);
set_choose.edit().putString(CHOOSEIMAGE,"true").commit();
PHONE_PREF是专门为存储而建的文件的文件名。
putString();是存放键值对的。而且也有很多类型的存储,如:putBoolean,putLong,putInt。如果用得到的都可以尝试一下。
2。后取:
SharedPreferences set_choose = getSharedPreferences(PHONE_PREF,0);
String choose = set_choose.getString(CHOOSE_ISTRUE,"");
在此要注意的便是上下一致。即,文件名一致,键一致,数据类型也要一直。
set_choose.getString(CHOOSE_ISTRUE,"");
键后面的双引号中为null,意思便是:当去这个键而没有对应东西的时候,取出来的是null。当然这个值也可以是别的。但是再次提醒。一定要数据类型一致。

    
[2] byte[]将图片变为字节存入流中,然后Bit地图将流读出,显示图片
    来源: 互联网  发布时间: 2014-02-18
byte[]将图片变为字节存入流中,然后Bitmap将流读出,显示图片
  这几天遇到一个问题,绊住好长时间,为了以后有据可查,现在记录下来。

问题:选中图片还会用在别的地方,所以先把图片以某种方式保存起来,然后到了用的时候再将图片取出来用。

这个的做法比较容易想到的就是流来存然后取;

1。首先就是先把图片读成字节,然后将字节保存在流中。


      //存储图片,变成byte形式,便于在上面取出
   byte[] buffer=new byte[1024];
                       //等号后面是图片的路径
        InputStream in= cr.openInputStream(uri);
                        //下面是将图片读成字节,而且是以1024为单位读的
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
//定义整数类型对象   
int number;
                         //利用循环方式将图片读完整
    while((number=in.read(buffer, 0, buffer.length))>0)
    {
    baos.write(buffer, 0, number);
    }
                        //将字节保存到byte[]数组对象中
    byte[] reallyByte=baos.toByteArray();
    //byte存储了图片,然后再用流存储图片,定义文件名和访问权限
    OutputStream os = openFileOutput("file.txt",Activity.MODE_PRIVATE);
    os.write(reallyByte);
    os.close();
//log一下,检验是否真的有字节存放到了指定文件夹中   
Log.v("MyPhoneText","reallyByte.length="+reallyByte.length); 


2。取出来

现在用到了再android中很重要的一个点Bitmap。一定记得要多留意此小东西的用法。前途无量。

  还要提醒下的是,要放在try中存储和读取流
try{
                 //定义BitmapFactory工厂的decodeStream方法,这个工厂方法很多。继续学习。方法内为存储图片的那个流文件的路径

Bitmap bitmap = BitmapFactory.decodeStream(this.openFileInput("file.txt"));
           //取出的bitmap对象就直接可以用来放在ImageView中显示
imageShow.setImageBitmap(bitmap);
}catch(Exception e){
e.printStackTrace();
}


    
[3] 施用基站、wifi实现定位
    来源: 互联网  发布时间: 2014-02-18
使用基站、wifi实现定位
    转载请注明出处
    android可以借助于gps实现定位,但是很多地方是使用gps无法定位比如在室内,而且gps定位的话速度慢。
   
    那么如何克服这样的缺点使得应用程序在室内也可以定位呢?办法是有的借助于基站和wifi进行定位。具体的细节可参考:
http://code.google.com/intl/zh-CN/apis/gears/geolocation_network_protocol.html


    下面的代码实现了定位的大致功能
    CellIDInfo.java 封装了cellid的信息
public class CellIDInfo {
	
	public int cellId;
	public String mobileCountryCode;
	public String mobileNetworkCode;
	public int locationAreaCode;
	public String radioType;
	
	public CellIDInfo(){}
}


        WifiInfo.java 封装了wifi的信息
public class WifiInfo {
	
	public String mac;
	
	public WifiInfo(){}
}


        CellIDInfoManager.java 可获取所有的CellIDInfo
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;

public class CellIDInfoManager {
	private TelephonyManager manager;
	private PhoneStateListener listener;
	private GsmCellLocation gsm;
	private CdmaCellLocation cdma;
	int lac;
	String current_ci,mcc, mnc;
	
	public CellIDInfoManager(){}
	
	public ArrayList<CellIDInfo> getCellIDInfo(Context context){
		manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
		listener = new PhoneStateListener();
		manager.listen(listener, 0);
		ArrayList<CellIDInfo> CellID = new ArrayList<CellIDInfo>();
		CellIDInfo currentCell = new CellIDInfo();
		
		int type = manager.getNetworkType();

		if (type == TelephonyManager.NETWORK_TYPE_GPRS || type ==TelephonyManager.NETWORK_TYPE_EDGE
				|| type ==TelephonyManager.NETWORK_TYPE_HSDPA) {
			gsm = ((GsmCellLocation) manager.getCellLocation());
		    if (gsm == null) return null;
		    lac  = gsm.getLac();
			mcc = manager.getNetworkOperator().substring(0, 3);
			mnc = manager.getNetworkOperator().substring(3, 5);
		    
			currentCell.cellId = gsm.getCid();
			currentCell.mobileCountryCode = mcc;
			currentCell.mobileNetworkCode = mnc;
			currentCell.locationAreaCode = lac;
			currentCell.radioType = "gsm";
			CellID.add(currentCell);
			
			List<NeighboringCellInfo> list = manager.getNeighboringCellInfo();
			int size = list.size();
			for (int i = 0; i < size; i++) {
				CellIDInfo info = new CellIDInfo();
				info.cellId = list.get(i).getCid();
				info.mobileCountryCode = mcc;
				info.mobileCountryCode = mnc;
				info.locationAreaCode = lac;
				CellID.add(info);
			}
			return CellID;
			
		} else if (type == TelephonyManager.NETWORK_TYPE_CDMA || type ==TelephonyManager.NETWORK_TYPE_1xRTT) {
			cdma = ((CdmaCellLocation) manager.getCellLocation());
			if (cdma == null) return null;
	    	
	    	if ("460".equals(manager.getSimOperator().substring(0, 3))) 
	    		return null;
		}
		return null;
	}
}



       WifiInfoManager.java 可获取wifi的信息,目前我只取了当前连接的wifi,没有获取所有能扫描到的wifi信息。
import java.util.ArrayList;

import android.content.Context;
import android.net.wifi.WifiManager;

public class WifiInfoManager {
	
	WifiManager wm;
	
	public WifiInfoManager(){}
	
	public ArrayList getWifiInfo(Context context){
		ArrayList<WifiInfo> wifi = new ArrayList();
		wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
		WifiInfo info = new WifiInfo();
		info.mac = wm.getConnectionInfo().getBSSID();
		wifi.add(info);
		return wifi;
	}
}


       调用google gears的方法,该方法调用gears来获取经纬度
private Location callGear(ArrayList<WifiInfo> wifi,
			ArrayList<CellIDInfo> cellID) {
    	
    	if (cellID == null) return null;
    	
    	DefaultHttpClient client = new DefaultHttpClient();

		HttpPost post = new HttpPost(
				"http://www.google.com/loc/json");
		JSONObject holder = new JSONObject();

		try {
			holder.put("version", "1.1.0");
			holder.put("host", "maps.google.com");
			holder.put("home_mobile_country_code", cellID.get(0).mobileCountryCode);
			holder.put("home_mobile_network_code", cellID.get(0).mobileNetworkCode);
			holder.put("radio_type", cellID.get(0).radioType);
			holder.put("request_address", true);
			if ("460".equals(cellID.get(0).mobileCountryCode)) 
				holder.put("address_language", "zh_CN");
			else
				holder.put("address_language", "en_US");
			
			JSONObject data,current_data;

			JSONArray array = new JSONArray();
			
			current_data = new JSONObject();
			current_data.put("cell_id", cellID.get(0).cellId);
			current_data.put("mobile_country_code", cellID.get(0).mobileCountryCode);
			current_data.put("mobile_network_code", cellID.get(0).mobileNetworkCode);
			current_data.put("age", 0);
			array.put(current_data);
			
			if (cellID.size() > 2) {
				for (int i = 1; i < cellID.size(); i++) {
					data = new JSONObject();
					data.put("cell_id", cellID.get(i).cellId);
					data.put("location_area_code", cellID.get(0).locationAreaCode);
					data.put("mobile_country_code", cellID.get(0).mobileCountryCode);
					data.put("mobile_network_code", cellID.get(0).mobileNetworkCode);
					data.put("age", 0);
					array.put(data);
				}
			}
			holder.put("cell_towers", array);
			
			if (wifi.get(0).mac != null) {
				data = new JSONObject();
				data.put("mac_address", wifi.get(0).mac);
				data.put("signal_strength", 8);
				data.put("age", 0);
				array = new JSONArray();
				array.put(data);
				holder.put("wifi_towers", array);
			}
			
			StringEntity se = new StringEntity(holder.toString());
			Log.e("Location send", holder.toString());
			post.setEntity(se);
			HttpResponse resp = client.execute(post);

			HttpEntity entity = resp.getEntity();

			BufferedReader br = new BufferedReader(
					new InputStreamReader(entity.getContent()));
			StringBuffer sb = new StringBuffer();
			String result = br.readLine();
			while (result != null) {
				Log.e("Locaiton reseive", result);
				sb.append(result);
				result = br.readLine();
			}

			data = new JSONObject(sb.toString());
			data = (JSONObject) data.get("location");

			Location loc = new Location(LocationManager.NETWORK_PROVIDER);
			loc.setLatitude((Double) data.get("latitude"));
			loc.setLongitude((Double) data.get("longitude"));
			loc.setAccuracy(Float.parseFloat(data.get("accuracy").toString()));
			loc.setTime(AppUtil.getUTCTime());
			return loc;
		} catch (JSONException e) {
			return null;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}


   目前已经测试过中国移动、联通的卡,以及测试过中兴的MIC,都可以准确定位。
   不支持的是cdma,将cdma的数据传入到gears后返回的经纬度显示是在美国。

   提外话,将gps和基站、wifi三者定位结合的话效果更好。基站的定位没有wifi准确,gps的定位速度比基站、wifi都来得更慢。
1 楼 superhanliu 2010-12-02  
如果能定位别人就爽了。
2 楼 fengzhizi715 2010-12-02  
superhanliu 写道
如果能定位别人就爽了。

可以做啊,做一个app放到别人的手机里,然后她每次更隔一段时间更新位置或者说更新经纬度的时候,发邮件或者sms给你。
3 楼 大柳树 2011-07-11  
没有例子吗?
4 楼 llyrike 2012-05-11  
google不是自带了定位的api吗?网络定位也在其中吧,为什么还要自己写这么多呢,设置一个监听不就得了?请指示

    
最新技术文章:
▪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