28-08-2014 3 条评论

错误原因:API等级 API 20:Android 4.4w,这是Android官网发布的可穿戴设备的API,它是不支持EditText组件的;

解决方案:在bulid.gradle里面将API版本改成19即可

参考:https://stackoverflow.com/questions/24451490/exception-raised-during-rendering-java-lang-system-arraycopy


14-08-2013 2 条评论

课程助理是一款集学业信息查询、学生随堂评教和师生互动交流为一体的移动教学应用软件。 学生不仅可以随时随地查询校历、课表、成绩等学业信息,还可以对课堂教学进行即时评价,轻松反馈课堂状况和学习效果,实现课堂教学质量的实时监控与数据分析。

目前仅支持南京工业大学在籍本科生使用

课程助理:让学业信息“随身”带,让教学评价“随堂”做!

南京工业大学矩阵实验室出品

功能简介与特色:
1、深度融合教务管理系统
2、随时查看课程安排情况
3、上课时间定时推送提醒
4、及时获取课程考试成绩
5、对每节课进行教学评价
6、更多功能,敬请期待!

现在就获取预览版

  

其他版本:


 



27-06-2013 0 条评论

最近莫名奇妙遇到“Conversion to Dalvik format failed: Unable to execute dex”错误,stackoverflow以后得到结果

把项目中classpath文件中<classpathentry kind="lib"   path ="自定义jar的地址" /> 修改成 <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>,删掉
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>。然后就OK了

18-04-2013 0 条评论

Eclipse 编译 Android工程时,提示该错误 :Error generating final archive:java.io.EOFException
问题所在及解决方法:
在Eclipse菜单Window -> Preferences -> Android -> Build,找到那个Default debug keystore显示的路径,就是debug.keystore这个文件(expired)过期了,它的路径就是文章《Android环境搭建及相关命令》里面说的设置SD卡img文件的上一层目录.android。
所以不论Windows系统还是Linux系统,只要删除这个debug.keystore就行了,Eclipse会自动生成一个新的,默认有效期也是一年。

17-04-2013 0 条评论

致各位亲爱的 Google 技术爱好者

很高兴的通知各位朋友,Nanjing GDG 将在本周日 (04/21) 举办我们 Nanjing GDG 的 4月份活动,热烈欢迎大家报名参加。

主题:利用开放社区和代码库来构建 Android 应用

时间: 4月21 日 (周日) 下午 2:30~5:00

地点: 南京大学鼓楼校区费彝民楼8楼 820(交通提示见下文)

日程安排:

14:30-16:00
1. 了解有哪些开放社区,分别提供了什么样的支持
2. 有哪些好的代码库
3. 如何利用这些来构建 Android 应用
3. 进一步了解一下 GDL,为什么我们应该去观看以及参与 GDL

16:00~16:30
茶歇,自由讨论

16:30~17:00
1. 关于未来活动的一些讨论
2. 头脑风暴,看看大家通过 Nanjing GDG 能做些什么
3. 大家想关注 Google IO 大会的哪些信息

交通线路:
地铁 1 号线鼓楼站 2 号出口出来,步行前往
1. 费彝民楼位于南大鼓楼校区北部,从北京西路进入,在晶丽酒店的西面。
2. 最近的地铁口为1号线(含南沿线)的鼓楼站2号出口。

联系人:
杜鹏霄: 13611512162 

在线报名:https://docs.google.com/forms/d/1Ykd4FJ2gqe5hXmk-wOh5PkarWdOfKI_q25LGYmF7ol0/viewform?pli=1

08-03-2013 1 条评论

我承认快用苹果助手是个好程序,但是那个苹果设备管理图标不能删除让人很不爽,今天终于解决。

Win+R打开运行,输入regedit打开注册表。
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerMyComputerNameSpace
里面仅保留DelegateFolders这一项(里面有两个子项),其它删除即可。

13-02-2013 0 条评论

在iOS6越狱发布前夕,大神一直提醒大家千万不要使用OTA升级自己的iOS设备,于是在各大水果论坛和网站都盛传OTA升级将无法越狱,而当越狱正是发布之后,大家发现即时OTA升级到最新iOS6.1.1版本都可以正常越狱,越狱以后系统依然稳定,和使用恢复升级没有任何差异。于是广大果粉开始质疑大神的警告,那OTA到底影响越狱吗?

在解答这个问题之前,我们先要了解一下是什么是OTA和越狱?

OTA(Over-the-Air Technology)空中下载技术。是通过移动通信(GSM或CDMA)的空中接口对SIM卡数据及应用进行远程管理的技术。苹果在iOS5中提供了OTA功能,这意味用户不再需要依靠电脑,可以直接在iOS设备上升级自己的系统。同时OTA升级采用的是增量升级的方法,例如最新6.1.1的升级补丁是23MB,如果使用传统iTunes升级则需要920MB,对于小水管的中国用户还是很有价值的。不仅如此,使用OTA升级可以完全保留系统中的应用程序和个人数据,而传统iTunes升级将需要重装所有应用程序(个人数据可以通过iCloud或者iTunes备份)。

越狱就不解释,大家都明白,就是获取系统的最高权限,类似于Android系统的Root。

如果从上面的内容看,似乎OTA和越狱并没有任何关系,越狱是针对iOS本身的,OTA只是iOS的一种升级方式,无论通过何种方式升级获得的iOS系统理论都是一样的,并没有区别,因此这就是为什么OTA升级后大家依然可以越狱的原因,那么到底是什么原因使得大神要劝告大家不要OTA升级呢?

这里,我要先解释另一个名词“SHSH”。SHSH的全称是Signature Hash blobs,中文:签名散列。 shsh就是验证iTunes恢复固件操作合法性的一个证书。当我们用iTunes进行恢复固件操作时,iTunes会向苹果验证服务器提交待恢复固件设备的ECID,并申请获取恢复该版固件的shsh验证证书(也就是说每个版本的固件,好比4.3.2版,4.3.3版和4.3.5版固件对应的shsh都是不一样,都是唯一的),苹果会通过验证服务器发送一个和ECID对应的shsh证书给iTunes,这样iTunes就可以继续进行和这个shsh相对应版本的固件恢复。打个比方shsh就好比一个钥匙,你有了4.3.3编号的钥匙才让你打开4.3.3编号的锁,你才能进4.3.3编号的家门。shsh文件存在于苹果服务器上,而且每当新固件发布时,苹果就会关闭前一版本shsh文件的提供,那我们在恢复固件尤其在为了完美越狱需要降级时又必须有相应版本所对应的shsh文件,这时就显得备份shsh的重要性了。同样打个比方,苹果提供4.3.5编号的钥匙了,就收起4.3.3编号的钥匙不给你了,所以你应该在苹果还给你4.3.3编号钥匙的时候就去备份一下钥匙。很不幸的是,当你现在看见这篇文章的时候,苹果真的已经不提供6.1之前的shsh了。

问题就在这个SHSH上,由于某些因素,iTunes恢复和OTA升级的系统获得SHSH并不相同,这就意味如果你使用OTA升级所获取的SHSH在苹果关闭对应SHSH服务并不能用于降级和平刷。或许这样说大家不容易明白,那我就举个例子。例如现在张老师有一台iPhone5,出厂是6.0.1,现在他要升级到6.1,无论使用iTunes恢复还是OTA,他都可以越狱。但是当苹果发布iOS7以后,并关闭6.1的SHSH认证以后,张老师万一尝鲜升级到iOS7或者不小心安装360需要重新刷机,如果使用OTA升级,那他备份的SHSH永远不把他的iPhone5带回6.1,而使用iTunes升级则可以随时恢复6.1(其实也不然,A5以上的设备即时有iTunes备份的SHSH暂时也无法降级,但是使用A4的iPhone4和iTouch4都是可以的)。

所以,其实OTA本身并不影响越狱,关键是OTA升级后我们无法备份正确的SHSH,这样我们就无法获取随心所欲的降级或平刷我们的系统。因此,如果你是水果玩家,我还是推荐老老实实使用iTunes升级;如果你是普通用户,或者像我这样懒得折腾,也不是非常注重是不是可以越狱的,那么OTA则是最为便捷的方式。

05-02-2013 1 条评论

参考文献:http://blog.csdn.net/fightingbull/article/details/8059651

AppSync其实这个方法早就有,但是前提是你的测试终端需要安装AppSync,但是除了大神,谁可以在iOS6上安装AppSync?好吧,这个问题现在已经解决了,因为大神把iOS6的破解放出来了,好吧现在就开始吧。

第一步,创建假证书

创建证书的过程比较简单,打开实用工具-钥匙串访问。然后在菜单栏里点击钥匙串访问-证书助理-创建证书来打开向导。第一个步骤比较重要,必须 要把名称命名为iPhone Developer,将类型设定为代码签名,将"让我覆盖这些默认值"选中。之后的步骤无需更改,一路点击“确定”和“继续”来完成这个向导就可以。

第二步,安装Xcode4.5.2

下载Xcode4.5.2,并安装。需要注意的是从Xcode4.4.1之后Xcode就变成了独立运行程序(stand-alone),其安装变成了Copy。首先将dmg里的Xcode复制到Applications目录下,然后运行,此过程中会出现简单的配置过程。

第三步,修改Xcode的配置文件

需要修改配置文件有两个SDKSettings.plist和Info.plist,在Xcode4.5以前这两个文件都是xml格式,而这之后变成了二进制格式,需要用Xcode来编辑这两个文件。
(1)SDKSettings.plist修改
1) 从Finder中进入文件所在目录
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk
2) 找到SDKSettings.plist文件,并鼠标右击Duplicate一份,在同目录下产生SDKSettings copy.plist文件。
3)双击打开SDKSettings copy.plist文件,默认用Xcode,找到DefaultProperties分支,将下面的CODE_SIGNING_REQUIRED和ENTITLEMENTS_REQUIRED两个属性改为NO
4)如果需要备份原文件,则将原文件改名为SDKSettings.plist.bak。然后将SDKSettings copy.plist,改名为SDKSettings.plist。
(2)修改Info.plist
1) 从Finder中进入文件所在目录
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
或是从(1)中后退到该目录。
2) 找到Info.plist文件,并鼠标右击Duplicate一份,在同目录下产生Info copy.plist文件。
3)双击打开Info copy.plist文件,默认用Xcode,将全部的XCiPhoneOSCodeSignContext修改成 XCCodeSignContext,即将其中的iPhoneOS去掉,Xcode4.5.1有三处分别位于DefaultProperties分支下、RuntimeRequirements->Classes和OverrideProperties分支下。
4)如果需要备份原文件,则将原文件改名为Info.plist.bak。然后将Info copy.plist,改名为Info.plist。

第四步,修改工程设置
特别注意:本阶段之前的修改配置文件、准备脚本等,只需要做一次。但本阶段的操作,对每个需要真机调试的工程都要做一遍。
这个步骤的主要作用是支持真机调试,如果不做这个步骤,仍然可以通过步骤5来生成ipa在真机上运行,但是无法使用Xcode内置的调试器对在真机上运行的程序进行单步跟踪。如果您的程序在点击Run真机调试时秒退,请检查此步骤是否正确完成。
 (1)禁用Xcode自动的签名操作
将工程配置中所有的Code Signing选项全部设为Don’t Code Sign,如图。可能需要先点击“All”让这个选项显示出来

(2)添加自定义的生成后脚本
在Build Phases中添加一个Phase,右下角的Add Build Phase,然后单击Add Run Script,输入以下脚本

export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ] || [ "${PLATFORM_NAME}" == "ipados" ]; then
/Applications/Xcode.app/Contents/Developer/iphoneentitlements/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

至此配置全部完成,下面就可以插上iPhone,重新选择生成目标来测试一下在线调试了!如果是第一次使用该设备调试,请先在Organizer中将设备切换为开发模式,

12-01-2013 2 条评论
public class busRoute extends MapActivity {

	private Button mBtnTransit = null; // 公交搜索
	private ListView busList;// 公交列表


	private MapView mMapView = null; // 地图View
	private MKSearch mSearch = null; // 搜索模块,也可去掉地图模块独立使用
	private MapController mapController;

	protected void onCreate(Bundle savedInstanceState) {

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

		BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
		if (app.mBMapMan == null) {
			app.mBMapMan = new BMapManager(getApplication());
			app.mBMapMan.init(app.mStrKey,
					new BMapApiDemoApp.MyGeneralListener());
		}
		app.mBMapMan.start();
		// 如果使用地图SDK,请初始化地图Activity
		super.initMapActivity(app.mBMapMan);

		mMapView = (MapView) findViewById(R.id.bmapView);
		mMapView.setBuiltInZoomControls(true);
		// 设置在缩放动画过程中也显示overlay,默认为不绘制
		mMapView.setDrawOverlayWhenZooming(true);

		GeoPoint geoPoint = new GeoPoint((int) (32.05000 * 1E6),
				(int) ( 118.78333* 1E6));

		// 取得地图控制器对象,用于控制MapView
		mapController = mMapView.getController();
		// 设置地图的中心
		mapController.setCenter(geoPoint);
		// 设置地图默认的缩放级别
		mapController.setZoom(12);

		// 初始化搜索模块,注册事件监听
		mSearch = new MKSearch();
		mSearch.init(app.mBMapMan, new MKSearchListener() {

			@Override
			public void onGetPoiDetailSearchResult(int type, int error) {
			}

			public void onGetDrivingRouteResult(MKDrivingRouteResult res,
					int error) {
				
			}

			public void onGetTransitRouteResult(MKTransitRouteResult res,
					int error) {
				if (error != 0 || res == null) {
					Toast.makeText(busRoute.this, "抱歉,未找到结果",
							Toast.LENGTH_SHORT).show();
					mMapView.setVisibility(View.VISIBLE);
					busList.setVisibility(View.GONE);
					return;
				}
				MyAdapter myAdapter = new MyAdapter(busRoute.this, res);
				busList.setAdapter(myAdapter);
			}

			public void onGetWalkingRouteResult(MKWalkingRouteResult res,
					int error) {
				
			}

			public void onGetAddrResult(MKAddrInfo res, int error) {
			}

			public void onGetPoiResult(MKPoiResult res, int arg1, int arg2) {

			}

			public void onGetBusDetailResult(MKBusLineResult result, int iError) {
			}

			@Override
			public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
				// TODO Auto-generated method stub

			}

			@Override
			public void onGetRGCShareUrlResult(String arg0, int arg1) {
				// TODO Auto-generated method stub

			}
		});

		// 设定搜索按钮的响应
		busList = (ListView) findViewById(R.id.bus_list);
		busList.setCacheColorHint(0);
		mBtnTransit = (Button) findViewById(R.id.transit);

		OnClickListener clickListener = new OnClickListener() {
			public void onClick(View v) {
				mMapView.setVisibility(View.GONE);
				busList.setVisibility(View.VISIBLE);
				SearchButtonProcess(v);
			}
		};
		mBtnTransit.setOnClickListener(clickListener);
	}

	void SearchButtonProcess(View v) {
		// 处理搜索按钮响应
		EditText editSt = (EditText) findViewById(R.id.start);
		EditText editEn = (EditText) findViewById(R.id.end);

		// 对起点终点的name进行赋值,也可以直接对坐标赋值,赋值坐标则将根据坐标进行搜索
		MKPlanNode stNode = new MKPlanNode();
		stNode.name = editSt.getText().toString();
		MKPlanNode enNode = new MKPlanNode();
		enNode.name = editEn.getText().toString();

		// 实际使用中请对起点终点城市进行正确的设定
		if (mBtnTransit.equals(v)) {
			mSearch.transitSearch("南京", stNode, enNode);
		} 
	}

	@Override
	protected void onPause() {
		BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
		app.mBMapMan.stop();
		super.onPause();
	}

	@Override
	protected void onResume() {
		BMapApiDemoApp app = (BMapApiDemoApp) this.getApplication();
		app.mBMapMan.start();
		super.onResume();
	}

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}

	// 填充公交列表
	class MyAdapter extends BaseAdapter {
		private MKTransitRouteResult res;
		private LayoutInflater mInflater;

		public MyAdapter(Context context, MKTransitRouteResult res) {
			this.res = res;
			this.mInflater = LayoutInflater.from(context);
		}

		@Override
		public int getCount() {
			return res.getNumPlan();
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			HolderView holder = null;
			if (convertView == null) {
				holder = new HolderView();
				convertView = mInflater.inflate(R.layout.list_item, null);
				holder.txt = (TextView) convertView
						.findViewById(R.id.list_item_txt);
				convertView.setTag(holder);
			} else {
				holder = (HolderView) convertView.getTag();
			}
			String lineInfo = "";
			// 得到解决方案
			MKTransitRoutePlan routePlan = res.getPlan(position);
			// 公交线路
			MKLine mkLine = routePlan.getLine(0);
			lineInfo += "乘坐:" + mkLine.getTitle();
			MKPoiInfo mkOnPoiInfo = mkLine.getGetOnStop();
			MKPoiInfo mkOffPoiInfo = mkLine.getGetOffStop();
			lineInfo += "ntttt从" + mkOnPoiInfo.name + "上车,在"
					+ mkOffPoiInfo.name + "下车";
			if (routePlan.getNumLines() > 0) {
				// 循环当前方案公交路线
				for (int i = 1; i < routePlan.getNumLines(); i++) {
					// 公交线路
					mkLine = routePlan.getLine(i);
					lineInfo += "n换成:" + mkLine.getTitle();
					mkOnPoiInfo = mkLine.getGetOnStop();
					mkOffPoiInfo = mkLine.getGetOffStop();
					lineInfo += "ntttt从" + mkOnPoiInfo.name + "上车,在"
							+ mkOffPoiInfo.name + "下车";
				}
			}
			holder.txt.setText(lineInfo);
			convertView
					.setOnClickListener(new MyListViewOnClick(position, res));
			return convertView;
		}
	}

	class HolderView {
		public TextView txt;
	}

	class MyListViewOnClick implements OnClickListener {
		private int index;
		private MKTransitRouteResult res;

		public MyListViewOnClick(int index, MKTransitRouteResult res) {
			this.index = index;
			this.res = res;
		}

		@Override
		public void onClick(View arg0) {
			TransitOverlay routeOverlay = new TransitOverlay(busRoute.this,
					mMapView);
			routeOverlay.setData(res.getPlan(index));
			mMapView.getOverlays().clear();
			mMapView.getOverlays().add(routeOverlay);
			mMapView.invalidate();
			mMapView.getController().animateTo(res.getStart().pt);
			busList.setVisibility(View.GONE);
			mMapView.setVisibility(View.VISIBLE);
		}
	}
}

下面是鄙人的代码,感谢发现错误和提出意见:

基于百度地图API的公交换乘导航

DEMO APK下载:

busMapDeno.apk 

09-11-2012 0 条评论

去年我们信息之夜我们进行过视频直播服务,当时我们使用了WMS(Windows Media Server)实现了这个服务,但是编码是微软的WMV,因而像iPhone/Android这样的智能手机无法观看,今天我给大家带来一种更简便的实现方式,并帮助所有平台用户都可以观看。

首先介绍一下,今天我们的工具VLC Player。

VLC主页:http://www.videolan.org 

VLC is a free and open source cross-platform multimedia player and framework that plays most multimedia files as well as DVD, Audio CD, VCD, and various streaming protocols.

VLC不仅仅是个播放器,也可以作为流媒体服务器使用。这个网上有相关的资料,我就不多说了。

声明下本文用的VLC版本:2.0.3

服务端操作

打开“媒体——流”选项,如图所示:

点击“捕获设备(D)”选项卡,选择“捕获模式”——“DirectShow”,“适配设备名称”——“Integrated Webcam”(或者你的摄像头、摄像机),“音频设备名称”——“内置式麦克风(IDT
High Definition)”(或者是你的外置麦克风),然后点击“串流”按钮。


点击“下一个”后,在“目标设置”界面选择“HTTP”,然后点击添加按钮


填上目标ip地址,并在“转码选项”中选择相应的编码类型


客户端操作

点击“媒体——打开网络串流”,在弹出的框中输入“http://127.0.0.1:8080/xxzy,点击“播放”按钮即可。

命令行操作方式
服务端:

vlc :sout=#transcode{vcodec=h264,vb=800,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100}:http{mux=ts,dst=:8080/xxzy} :sout-keep

客户端

vlc http://127.0.0.1:8080/xxzy

VLC除了可以使用HTTP协议发布,还可以使用RTP、RTSP、UDP发布,大家可以自己尝试。

  • About Totoro

  • 近期文章

  • 2017年五月
    « 10月    
     123456
    78910111213
    14151617181920
    21222324252627
    28293031  
  • 分类目录

  • 近期评论

  • 标签

  • 功能

  • 友情链接