这一段应学妹要求,做了一个关于物联网的wifi robot的安卓端应用,其中很多的代码段都是参考网上的,没有什么原创性可言,这里我就发一些自己遇到的问题,给大家一点借鉴。
应用功能是 首先一个欢迎界面,几秒钟后跳转到状态显示页面,显示下位机传来的温度,PH等数值,左右滑动进入视频显示界面,并有舵机的控制按键。
其中wifi的刷机教程网上有很多,这里不赘述。
遇见的第一个问题:界面跳转时自动弹出->原因:没有在AndroidMainfest.xml中添加自定义的Activitiy,红色为自定义的部分。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lessonone" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.lessonone.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <span style="color:#ff0000;"><activity android:name=".statusActivity" > </activity> <activity android:name=".controlActivity" > </activity></span> </application> </manifest>
因为参考了一个APP,遇到了一些反编译的问题。
1.像类似这种语句,其内部的参数可以在R中查找。
super.onCreate(paramBundle); setContentView(2130903042);2.这里有无用的局部变量
TextView localTextView1 = (TextView)findViewById(2131099659); this.tempTextView = localTextView1;可以改写为
tempTextView=(TextView)findViewById(2131099659);其中tempTextView为自定义的本地变量,数字是ID号。
3.内部方法
package dennis.android; import android.view.View; import android.view.View.OnClickListener; import dalvik.annotation.EnclosingMethod; @EnclosingMethod class ControlActivity$7 implements View.OnClickListener { public void onClick(View paramView) { SocketThread localSocketThread = this.this$0.socketThread; byte[] arrayOfByte = ControlActivity.access$6(this.this$0); localSocketThread.send(arrayOfByte); } }经常有人问到EnclosingMethod 的问题,网上的解答也不多。这里会在左边的项目栏中出现一个新的Activity,其实是一个内部的方法调用。
这里的access指的是其他类的外部方法。实际的代码差不多如下:
rightButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub byte[] ArrayofByte = CMD_RIGHT; // TODO Auto-generated method stub socketThread.send(ArrayofByte); } });
<span style="color:#ff6666;">while(true)</span> { try { videoUrl=new URL(url); conn=(HttpURLConnection)videoUrl.openConnection(); conn.setDoInput(true); conn.connect(); inputStream=conn.getInputStream(); bmpBitmap=BitmapFactory.decodeStream(inputStream); Bitmap localBitmap=bmpBitmap; int i=ScreenW; int j=ScreenH; Bitmap dstmBitmap=Bitmap.createScaledBitmap(localBitmap, i, j,true); bmpBitmap=dstmBitmap; canvas=new Canvas(bmpBitmap); canvas=surfaceHolder.lockCanvas(); canvas.drawBitmap(bmpBitmap, 0,0,null); surfaceHolder.unlockCanvasAndPost(canvas); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }第四个问题:使用自定义的surfaceview不显示,会黑屏。记得在红色部分换上自定义的类代替原来的控件。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <<span style="color:#ff0000;">com.example.lessonone.MySurfaceView</span> android:id="@+id/surfaceView1" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginBottom="35dp" android:layout_marginLeft="53dp" android:text="Button" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button1" android:layout_alignBottom="@+id/button1" android:layout_alignParentRight="true" android:layout_marginRight="38dp" android:text="Button" /> </RelativeLayout>最后一个问题:额,不用忘了入网许可,在第一个XML中有体现。
本人属于菜鸟级别,有什么说错的地方,敬请指导。