基于eclipse创建Android--室内定位项目

1.建项目时遇到的问题及解决方案
(1)appcompat-v7兼容

a.创建时主题选择Theme.Holo.Light.时,总会有报错。
报错是由于导入的工程未加入AppCompatandroid.support:appcompat-v7兼容包

b.Eclipse创建Android项目时,会多出一个appcompat_v7的问题;也是兼容的原因。

解决最小版本选择Android4.0及以上。此时主题问题也解决了!!解决:最小版本选择Android4.0及以上。此时主题问题也解决了!!

(2)区分:应用名,项目名称,包名
(3)ADT与SDK版本

ADT与SDK版本不适配可能导致创建项目时,不会自动在src和layout下生成代码。
解决:在新建工程的时候,不选择Black activity,而是选择Empty activity

(4).xml文件,android:id="@id/getrss"报错,

解决:自动生成ids.xml文件 或者
应该为:android:id="@+id/getrss"

(5)手机模拟器内存目录:mnt/sdcard

Tps数据存入excel中

(6)路径简洁化处理
private final String USER_DIR="songmake";

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
   	File externDir=Environment.getExternalStorageDirectory();
	File externDataDir=new File(externDir,USER_DIR);//USER_DIR是之前声明的目录
	//上面适合写文件时新建文件夹目录
	//如果是读文件,可以如下,继续组合File对象&文件后缀名
	File externDataFile=new File(externDataDir,strUser+".txt"); 
	//OR
	File externDataFile=new File(externDataDir,"ap_mu.csv");
	}
(7)Button启动处理,TextView显示处理

a.TextView显示处理

//先在全局初始化
TextView txtvTime=null;
//在OnCreate()中找到layout的id
txtvTime=(TextView) findViewById(R.id.txtv_time_id);
//再在函数中对其 **txtvTime**进行处理
private final Handler handler = new Handler( ) {...}
//TextView的处理函数有:
		setVisibility(View.VISIBLE);
		setText();
		append();
		...

b.Button启动处理
???判断Button是否按下,按下之后颜色发生变化的程序编写(待续)

//在对应的按钮函数中进行处理
//在layout.xml中有如下属性定义按键函数
android:onClick="btnStartClick"
//那么,对应的函数如下
public void btnStartClick(View v) {
	int btnId = v.getId();
	Button btn = (Button) findViewById(btnId);
	String strBtn = btn.getText().toString();
	......
}
(8)项目效率极低,运行缓慢
2.类创建,数据处理
  • layout界面编辑
  • MainActivity编程,OnCreate函数,Button处理函数等等
  • 数据处理类编程
  • 定位处理类编程
(1)数据处理类编程
目的:处理参考点与测试点数据(RPS&TPS),存入java的ArrayList中

a.需要和存储交互。
内存不需要权限。
外存SD卡需要权限

<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 --> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

内存路径: data/data/包名文件夹
外存路径: storage/sdcard

利用java项目先确定数据处理是否正确?!方便调试,若调试正确,再移植到Android项目中~
代码如下:

 		ArrayList<ArrayList<Double>> rps = new ArrayList<ArrayList<Double>>();
		
		File file = new File("D:/file/Documents/IndoorPositionAPP/RPS/ap_mu.csv");
		//Android项目的路径需要对应修改
		FileInputStream fis;
		try {
			fis = new FileInputStream(file);
			BufferedReader bReader =new BufferedReader(new InputStreamReader(fis));
			String string;
			int i=0;
			while ((string = bReader.readLine()) != null){
				String[] strings = string.split(",");
				ArrayList<Double> rp = new ArrayList<>();
				for(String s:strings)
				{
					rp.add(Double.parseDouble(s));
				}
				i++;
				System.out.println("第"+i+"行:");
				System.out.println(rp);
				System.out.println();
				rps.add(rp);
			}
			bReader.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
(2)定位处理类编程
目的:将一个测试点与所有参考点匹配,确定定位
Created with Raphaël 2.2.0 随机挑选1个测试点TP 获取TP的RSS,loc。将真实位置显示在TextView上 采用最强信号原则对TP_RSS进行排序 选出最强原则对应的RPS_RSS 计算TP与所有RPS的相似度,存入sim 根据sim进行匹配定位,即可得到定位结果

只是想粗略的理一下顺序,第一次用MarkDown画流程图
a.采用最强信号原则对TP_RSS进行排序

public static ArrayList<Integer> mySort(ArrayList<Double> TP)
//数组TP降序排列,并返回对应的下标数组,已将RSS=-100的数从数组中剔除掉了
	{
		ArrayList<Integer> index = new ArrayList<>();
		HashMap<Integer, Double> map = new HashMap<>();
		for(int i=0;i<TP.size();i++)
		{
			map.put(i, TP.get(i));
		}
		Collections.sort(TP);
		Collections.reverse(TP);
		for(int i=0;i<TP.size()&&TP.get(i)!=-100;i++)
		{
			for (Map.Entry<Integer, Double> mEntry : map.entrySet()) {
				if(mEntry.getValue().equals(TP.get(i)))
				{
					index.add(mEntry.getKey());
					mEntry.setValue(0.0);
					break;
				}	
				
			}
		}
//		TP.subList(0, index.size()); //想只保留最强信号原则下对应长度的信号,结果没成功
//		TP.removeRange(index.size(),TP.size());
		return index;
	}

b.计算TP与所有RPS的相似度,存入sim

	public static ArrayList<Double> getSim(ArrayList<Double> TP, ArrayList<ArrayList<Double>> RPS) {
	//计算单个测试点与各个参考点的相似度,存入数组返回
		ArrayList<Double> sim = new ArrayList<>();
		int K = 1;
		int M = 40;
		ArrayList<Integer> index = new ArrayList<Integer>();	//初始化单个测试点对应的下标,后面进行排序
		index = mySort(TP);
		int L = index.size();
		if (M>L) {
			M = L;
		}
//		ArrayList<Double> rp = new ArrayList<Double>();
		
		for (int j = 0; j < RPS.size(); j++) {
			double sum = 0;
			double rp = 0;
//			System.out.println("排序后的------参考点的RSS:");
			for (int i = 0; i < L; i++) {
//				rp.add(RPS.get(j).get(index.get(i)));
				rp = RPS.get(j).get(index.get(i));
				
//				System.out.print(rp+",");
				sum += Math.pow((rp-TP.get(i)), 2);
			}
//			System.out.println();
			sim.add(Math.pow(sum,0.5)/M);	
		}
		return sim;
	}

待续。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值