【《基于Android的智能車輛遠程監(jiān)控系統(tǒng)設計》19000字】_第1頁
【《基于Android的智能車輛遠程監(jiān)控系統(tǒng)設計》19000字】_第2頁
【《基于Android的智能車輛遠程監(jiān)控系統(tǒng)設計》19000字】_第3頁
【《基于Android的智能車輛遠程監(jiān)控系統(tǒng)設計》19000字】_第4頁
【《基于Android的智能車輛遠程監(jiān)控系統(tǒng)設計》19000字】_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

附錄[7]。為了創(chuàng)建或打開現(xiàn)有數(shù)據(jù)庫并返回一個可以讀寫數(shù)據(jù)庫的對象,需要在構造SQLiteOpenHelper的實例之后,還需要調(diào)用getReadableDatabase()方法來創(chuàng)建數(shù)據(jù)庫。數(shù)據(jù)庫文件將存放于/data/data/<packageName>/databases/目錄中。在明確了用戶信息表的內(nèi)容和SQLiteOpenHelper的使用方法后,下面編寫SQLiteOpenHelper類來創(chuàng)建用于存儲用戶注冊信息的SQLite數(shù)據(jù)庫,SQLiteOpenHelper類中的方法如表3-1所示。表3-1SQLiteOpenHelper類下面通過具體代碼來說明數(shù)據(jù)庫創(chuàng)建的步驟以及表3-1中各方法的定義:為了在代碼中執(zhí)行SQL語句,編寫DBOpenHelper類繼承自SQLiteOpenHelper,重寫onCreate()方法,在onCreate()方法中調(diào)用SQLiteDatabase的execSQL()方法執(zhí)行建表語句,此部分的代碼如下:Code:在DBOpenHelper中執(zhí)行建表語句CREATETABLEIFNOTEXISTSuser(_idINTEGERPRIMARYKEYAUTOINCREMENT,uesrnameVARCHAR(20)userpasswordVARCHAR(20),userphonenumVARCHAR(20);useremailVARCHAR(20))當用戶完成注冊后,需要向數(shù)據(jù)庫中添加數(shù)據(jù),因此定義add方法用于向數(shù)據(jù)庫中添加數(shù)據(jù),調(diào)用add方法后,數(shù)據(jù)庫將執(zhí)行SQL的插入語句將數(shù)據(jù)添加到數(shù)據(jù)庫中。具體代碼如下所示:Code:add方法publicvoidadd(Stringusername,Stringuserpassword,Stringuseremail,Stringuserphonenum){

db.execSQL("INSERTINTOuser(username,userpassword,useremail,userphonenum)VALUES(?,?,?,?)",newObject[]{username,userpassword,useremail,userphonenum});

}在后面的登錄過程中,要將用戶輸入的用戶名和密碼與數(shù)據(jù)庫中存在的信息進行匹配,因此定義方法getAllData()用于獲取數(shù)據(jù)庫當中的全部數(shù)據(jù)并將其以數(shù)組列表的形式返回。在Android中查詢數(shù)據(jù)是通過Cursor類來實現(xiàn)的,在getAllData()中,首先通過調(diào)用SQLiteDatabase.query()方法來構造Cursor對象,Cursor指向數(shù)據(jù)庫中的一行數(shù)據(jù),再在while循環(huán)中調(diào)用Cursor類的moveToNext()將光標依次移動到下一行,若下一行的數(shù)據(jù)不為空,則調(diào)用Cursor的getString()方法以及ArrayList<User>.add()方法將光標指向的該行數(shù)據(jù)添加到ArrayList<User>中,當while循環(huán)結束以后,即所有的用戶信息數(shù)據(jù)都被添加到ArrayList<User>,將ArrayList<User>對象返回。該方法中對象和方法名的如表3-2和表3-3所示。類名對象名說明ArrayList<User>list存儲用戶數(shù)據(jù)Cursorcursor定位數(shù)據(jù)庫中的行,移動到指定行,獲取該行數(shù)據(jù)Stringname存儲cursor指定行的用戶名Stringphonenum存儲cursor指定行的電話號碼Stringemail存儲cursor指定行的郵箱地址Stringpassword存儲cursor指定行的密碼表3-2getAllData方法中的對象方法名說明cursor.moveToNext存儲用戶數(shù)據(jù)db.query定位數(shù)據(jù)庫中的行,移動到指定行,獲取該行數(shù)據(jù)cursor.getString用戶密碼list.add電子郵箱地址userphonenum電話號碼表3-3getAllData方法中的方法名getAllData方法的具體代碼如下:Code:getAllData方法publicArrayList<User>getAllData(){

ArrayList<User>list=newArrayList<User>();

@SuppressLint("Recycle")Cursorcursor=db.query("user",null,null,null,null,null,"nameDESC");

while(cursor.moveToNext()){

Stringname=cursor.getString(cursor.getColumnIndex("name"));

Stringemail=cursor.getString(cursor.getColumnIndex("email"));

Stringphonenum=cursor.getString(cursor.getColumnIndex("phonenum"));

Stringpassword=cursor.getString(cursor.getColumnIndex("password"));

list.add(newUser(name,password,email,phonenum));

}

returnlist;

}3.3.2用戶注冊界面的設計通過上述步驟實現(xiàn)了SQLiteOpenHelper類后,就可以利用它來實現(xiàn)注冊和登錄功能。表3-4和表3-5為用戶注冊界面設計中用到的部分對象和方法。類名對象名說明EditTextrName用戶名輸入框EditTextrEmail電子郵箱輸入框EditTextrPhone電話號碼輸入框EditTextrPsw1密碼輸入框EditTextrPsw2確認密碼輸入框DBOpenHelpermDBOpenHelper實現(xiàn)對數(shù)據(jù)庫相關操作StringUsername存儲用戶輸入的用戶名Stringpassword1存儲用戶輸入的密碼StringPassword2存儲用戶輸入的確認密碼StringEmail存儲用戶輸入的郵箱地址Stringphonenum存儲用戶輸入的電話號碼Intentintent實現(xiàn)界面跳轉表3-4用戶注冊界面的對象方法名說明btn_register.setOnClickListener(this)設置按鈕監(jiān)聽器rName.getText().toString().trim()返回用戶輸入的用戶名TextUtils.isEmpty(username)判斷username是否非空password1.equals(password2)判斷密碼和確認密碼輸入框的內(nèi)容是否相同mDBOpenHelper.add(username,password2,email,phonenum)添加用戶注冊數(shù)據(jù)到數(shù)據(jù)庫中表3-5用戶注冊界面的方法以下說明注冊功能實現(xiàn)的具體步驟:(1)構造EditText對象rName,rEmail,rPhone,rPsw1,rPsw2,使用findViewById()方法獲取用戶注冊界面輸入框控件,然后對EditText對象使用getText().toString().trim()方法來返回字符串對象,用于獲得用戶注冊時在輸入框中輸入的信息。(2)在if語句中使用TextUtils.isEmpty()方法來判斷用戶輸入的注冊信息是否為空,如果都不為空則使用password1.equals(password2)來判斷兩次輸入的密碼是否一致,若兩次輸入的密碼一致,則構造SQLiteOpenHelper類的對象,調(diào)用SQLiteOpenHelper的add方法,將用戶輸入的注冊信息添加到數(shù)據(jù)庫中。若用戶輸入的兩次密碼不一致或者注冊信息不完善,則不執(zhí)行add方法,并通過Toast提示用戶注冊失敗。(3)注冊完成后,利用Intent將注冊界面跳轉到登錄界面,用戶可進行下一步的登錄操作。此部分的代碼如下:Code:注冊按鈕點擊事件代碼if(!TextUtils.isEmpty(username)&&!TextUtils.isEmpty(password1)&&!TextUtils.isEmpty(password2)){

//判斷兩次密碼是否一致

if(password1.equals(password2)){

//將用戶名和密碼加入到數(shù)據(jù)庫中

mDBOpenHelper.add(username,password2,email,phonenum);

Intentintent1=newIntent(registered.this,login.class);

startActivity(intent1);

finish();

Toast.makeText(this,"驗證通過,注冊成功",Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(this,"兩次輸入的密碼不一致,注冊失敗,請重寫輸入注冊信息",Toast.LENGTH_SHORT).show();

}

}else{

Toast.makeText(this,"注冊信息不完善,注冊失敗",Toast.LENGTH_SHORT).show();

}3.3.3用戶登錄界面的設計為實現(xiàn)用戶登錄界面,在布局文件中創(chuàng)建activety_login.xml,整個界面采取垂直方向的LinearLayout布局,并在其中嵌套水平方向的LinearLayout布局,在里面放置用戶名和密碼的文本框TextView以及輸入框EditText,并放置兩個按鈕Button,用于登錄或者注冊,還有復選框CheckBox,用于勾選是否需要記住密碼,登錄界面如圖3-6所示。圖3-6用戶登錄界面圖在登錄界面中,要實現(xiàn)的功能是:用戶將自己在注冊時填寫的用戶名和密碼輸入到文本框中,點擊“登錄”按鈕完成登錄,之后將跳轉到車輛監(jiān)控系統(tǒng)的界面當中。用戶如果需要使用“記住密碼”功能,可以勾選記住密碼復選框,下次打開APP后就不用重復輸入用戶名和密碼,若用戶當前還未注冊,則點擊“注冊”按鈕跳轉到注冊界面進行用戶信息的注冊。圖3-7說明了登錄的流程。圖3-7用戶登錄流程通過以下幾個步驟來編寫用戶登錄的功能:(1)在onCreate()中使用mDBOpenHelper=newDBOpenHelper(this)構造一個DBOpenHelper對象用于對數(shù)據(jù)庫進行管理,便于后面對數(shù)據(jù)庫中的用戶信息進行查詢。(2)構造ArrayList<User>對象data,調(diào)用mDBOpenHelper.getAllData()來將數(shù)據(jù)庫中所有的用戶信息存儲到data中(3)調(diào)用EditText對象的方法getText().toString().trim(),用Sting對象name和password來分別存儲用戶登錄時輸入的用戶名和密碼。(4)通過語句name.equals(user.getName())&&password.equals(user.getPassword())來判斷用戶輸入的用戶名和密碼是否與數(shù)據(jù)庫中存儲的用戶名和密碼相同。(5)若用戶輸入的用戶名和密碼與數(shù)據(jù)庫中存儲的用戶名和密碼相同,則新建一個子線程,用于用戶登錄,并在線程中使用sleep(2000),讓程序休眠兩秒,模擬登錄時間,之后再用intent跳轉到MainActivity.class,即車輛監(jiān)控系統(tǒng)的界主面。子線程的代碼如下:Code:子線程中實現(xiàn)登錄按鈕點擊事件Threadthread=newThread(){

@Override

publicvoidrun(){

try{

sleep(2000);

Stringuser_name=userName;

Intentintent1=newIntent(login.this,MainActivity.class);

startActivity(intent1);

finish();

}catch(Exceptione){

e.printStackTrace();

}

}

};

thread.start();根據(jù)用戶登錄界面所要實現(xiàn)的功能,除了上述步驟外,還需利用SharedPreferences來完成記住密碼的功能,SharedPreferences存儲不同于文件的存儲方式,它是使用鍵值對的方式來存儲數(shù)據(jù)的,也就是說,當保存一條數(shù)據(jù)的時候,需要給這條數(shù)據(jù)提供一個對應的鍵,這樣在讀取數(shù)據(jù)的時候就可以通過這個鍵把相應的值取出來。在獲取一個SharedPreferences對象之后,要在SharedPreferences文件中存儲數(shù)據(jù),主要分為3步實現(xiàn)。(1)調(diào)用SharedPreferences對象的edit()方法來獲取一個SharedPreferences.Editor對象。(2)向SharedPreferences.Editor對象中用putString()方法添加數(shù)據(jù)。(3)調(diào)用apply()方法將添加的數(shù)據(jù)提交,從而完成數(shù)據(jù)的存儲操作。記住密碼功能實現(xiàn)的代碼為:Code:記住密碼功能的實現(xiàn)SharedPreferencessp=getSharedPreferences("user_mes",MODE_PRIVATE);editor=sp.edit();if(cb_rmbPsw.isChecked()){

editor.putBoolean("flag",true);

editor.putString("user",user.getName());

editor.putString("psw",user.getPassword());

editor.apply();

match2=true;

}else{

editor.putString("user",user.getName());

editor.putString("psw","");

editor.apply();

match2=false;

}如果記住密碼按鈕被勾選,則在editor中添加當前用戶輸入的用戶名和密碼,并通過apply()提交,否則將editor中不添加當前用戶輸入的密碼。通過上述的代碼將用戶登錄信息存儲到SharedPreferences中后,下次用戶登錄時,就可以利用SharedPreferences讀取數(shù)據(jù)來獲取用戶登錄信息。SharedPreferences對象提供了一系列的get方法,用于對存儲的數(shù)據(jù)進行提取,當讀取字符串時可以使用getString()方法,它接收兩個參數(shù),第一個參數(shù)是鍵,傳入存儲數(shù)據(jù)時使用的鍵就可以得到相應的值;第二個參數(shù)是默認值,表示當傳入的鍵找不到對應的值時會以什么樣的默認值進行返回。在本文中,通過以下代碼來實現(xiàn):Code:選擇“記住密碼”功能后,填寫用戶和密碼信息Stringuser_read=sp.getString("user","");

Stringpsw_read=sp.getString("psw","");

et_User.setText(user_read);

et_Psw.setText(psw_read);3.4GIS界面的設計Android設備獲取位置可以使用GPS和Android網(wǎng)絡位置提供器(NLP),為了實現(xiàn)對車輛位置信息的監(jiān)控,本文選擇使用百度地圖API對百度地圖進行二次開發(fā),利用百度地圖的地圖和地理信息顯示功能來完成對車輛位置的實時監(jiān)控。在車輛監(jiān)控系統(tǒng)中使用百度地圖API,需要完成一些準備步驟。第一步:申請APIkey(AK),因為地圖初始化時需要使用AK,獲取AK的流程大致可分為如下四個步驟:(1)登錄API控制臺;(2)創(chuàng)建應用;(3)配置SHA1和包名;(4)提交生成AK。第二步:在申請了AK后下載Android定位SDK并解壓,將libs中的jar和so放置到工程中jniLibs目錄相應的位置,如圖3-8所示。在項目中集成BaiduMapSDK,才能繼續(xù)對百度地圖進行開發(fā)。圖3-8jniLibs目錄第三步:配置build.gradle文件,在build.gradle文件中添加如下代碼后再對項目進行SYNC操作:Code:配置build.gradle文件sourceSets{

main{

jniLibs.srcDir'libs'

jni.srcDirs=[]

}

}dependencies{

implementationfileTree(dir:'libs',include:['*.jar'])

androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2',{

excludegroup:'com.android.support',module:'support-annotations'

})}第四步:添加AK。完成上述準備步驟后,獲得開發(fā)者密鑰AK,在AndroidManifest.xml文件中對開發(fā)者密鑰進行配置,由于地圖的顯示還需要網(wǎng)絡和定位等相關權限,還需在AndroidManifest.xml中添加相應代碼以獲取相應的權限,AndroidManifest.xml中添加的代碼如下:Code:配置AndroidManifest.xml文件<meta-dataandroid:name="com.baidu.lbsapi.API_KEY"

android:value="bz3zeOp8LQhPavNQKf37aY7VUjw2pBFp"></meta-data><uses-permissionandroid:name="android.permission.INTERNET"/><!--獲取網(wǎng)絡狀態(tài),根據(jù)網(wǎng)絡狀態(tài)切換進行數(shù)據(jù)請求網(wǎng)絡轉換--><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><!--讀取外置存儲。如果開發(fā)者使用了so動態(tài)加載功能并且把so文件放在了外置存儲區(qū)域,則需要申請該權限,否則不需要--><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><!--寫外置存儲。如果開發(fā)者使用了離線地圖,并且數(shù)據(jù)寫在外置存儲區(qū)域,則需要申請該權限-->

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>為了實現(xiàn)地圖定位界面,在布局文件中編寫fragment_home.xml,整個界面采取垂直方向的LinearLayout布局,放置com.baidu.mapapi.map.MapView和TextView用于顯示地圖和地理位置信息,又通過嵌套RelativeLayout在com.baidu.mapapi.map.MapView中放置一個“定位”按鈕Button,整個地圖定位界面如圖3-9所示。圖3-9地圖定位界面圖在地圖定位界面Java代碼中用到的對象和方法如表3-6和表3-7所示。類名對象名說明TextViewlocationInfo顯示定位信息MapViewmapView地圖控件MyLocationListenermyListener獲取定位數(shù)據(jù)Buttonlocationbt定位按鈕LocationClientOptionoptionMapView初始化選項,用于設置地圖LocationClientmLocationClient用于發(fā)起定位BaiduMapmbaiduMap用于顯示地圖StringBuildercurrentPosition用于添加定位信息LatLngll地理坐標基本數(shù)據(jù)結構,用于獲取經(jīng)緯度MyLocationDatalocData定位數(shù)據(jù)構造器MapStatus.Builderbuilder地圖狀態(tài)構造器表3-6地圖定位界面用到的對象方法名說明mapView.getMap()獲取地圖控件引用mLocationClient.registerLocationListener(myListener)注冊監(jiān)聽函數(shù)mbaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL)設置地圖顯示樣式mbaiduMap.setMyLocationEnabled(true)開啟地圖定位圖層mLocationClient.start()開啟定位mLocationClient.setLocOption(option)設置地圖定位選項mbaiduMap.setMyLocationData(locData)設置定位數(shù)據(jù)builder.target(ll).zoom(18f)縮放視圖mbaiduMap.animateMapStatus()更新位置表3-7地圖定位界面用到的對象3.4.1顯示地圖在Java代碼文件中通過mapView=root.findViewById(R.id.bmapView)獲取百度map控件,再利用mapView.getMap()方法獲取地圖控件引用。再調(diào)用mbaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL)設置地圖的顯示樣式,最后調(diào)用SDKInitializer.initialize(getApplicationContext())完成SDK的初始化,即可顯示地圖。該部分代碼如下:Code:顯示地圖SDKInitializer.initialize(getActivity().getApplicationContext());mapView=root.findViewById(R.id.bmapView);//獲取百度map控件

mbaiduMap=mapView.getMap();//獲取地圖控件引用

mbaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//設置地圖顯示為普通樣式3.4.2顯示地圖的定位為了顯示車輛在地圖中的定位,在布局文件中添加一個按鈕,在Java代碼文件中編寫按鈕點擊事件代碼,具體實現(xiàn)步驟如下:1、通過LatLngll=newLatLng(bdLocation.getLatitude(),bdLocation.getLongitude())構造LatLng對象,LatLng對象用于獲取經(jīng)緯度,構造定位數(shù)據(jù);2、構造MyLocationData對象,用于獲取定位數(shù)據(jù)。調(diào)用mbaiduMap的setMyLocationData方法,傳入MyLocationData對象,用于設置定位數(shù)據(jù)。4、構造MapStatus.Builder對象,用于縮放當前視圖并更新當前的定位信息。該部分代碼如下:Code:顯示定位LatLngll=newLatLng(bdLocation.getLatitude(),bdLocation.getLongitude())MyLocationDatalocData=newMyLocationData.Builder()

.accuracy(bdLocation.getRadius())

//此處設置開發(fā)者獲取到的方向信息,順時針0-360

.direction(100).latitude(bdLocation.getLatitude())

.longitude(bdLocation.getLongitude()).build();;mbaiduMap.setMyLocationData(locData);MapStatus.Builderbuilder=newMapStatus.Builder();

builder.target(ll).zoom(18f);//縮放當前視圖

mbaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));//更新當前位置信息3.4.3顯示定位數(shù)據(jù)信息地圖下方通過locationInfo=root.findViewById(R.id.locationInfo)獲取TextView控件,用于顯示定位的數(shù)據(jù)信息,包括經(jīng)緯度、國家、省份、地區(qū)、街道、定位方式等。具體實現(xiàn)步驟如下:聲明LocationClient類對象,該對象初始化需傳入Context類型參數(shù)。使用getApplicationConext()方法獲取全進程有效的Context。利用LocationClientOption類配置定位SDK參數(shù)。其中,option.setLocationMode用于設置定位模式,默認高精度編寫MyLocationListener類,其繼承BDAbstractLocationListener類,在MyLocationListener類中重寫onReceiveLocation方法,在onReceiveLocation中創(chuàng)建StringBuilder對象用于添加定位信息,定位信息的添加的內(nèi)容來自bdLocation對象,其getLatitude()方法返回當前定位的緯度,getLongitude()返回定位的經(jīng)度,getProvince()返回定位的省份,getCity()返回定位的城市,getAddrStr()返回地址。3.5車載視頻與方向盤轉角獲取的設計編寫用于顯示車載視頻和方向盤的布局文件fragment_dashboard.xml,整個界面采取垂直方向的LinearLayout布局,在里面包含RadioGroup,RadioGroup采用水平布局,并在RadioGroup中放置三個RadioButton,RadioButton提供了互斥選項組成的選項集。使用戶在同一時間只能選擇“車載監(jiān)控視頻”、“方向盤”、“方向盤數(shù)據(jù)”三項中的一項進行顯示。在RadioGroup下方嵌套RelativeLayout并在其中放置VideoView、com.github.mikephil.charting.charts.LineChart、ImageView、TextView分別用于顯示視頻、圖表、方向盤圖片、方向盤轉角信息。整個界面如圖3-9所示。圖3-9車載視頻與方向盤界面圖3.5.1車載視頻車載視頻的播放可以使用VideoView來完成,VideoView繼承了SurfaceView同時實現(xiàn)了MediaPlayerControl接口,可以方便地實現(xiàn)對視頻的播放。具體實現(xiàn)步驟如下:在布局文件中放置VideoView控件用于播放視頻,并在在Java代碼中初始化。在Androidstudio項目路徑中的app\src\main\res\raw文件夾下放置將要用于播放的MP4格式視頻文件。在Java代碼中編寫initLocalVideo方法用于播放視頻initLocalVideo方法首先調(diào)用VideoView的setVideoURI方法用于設置視頻播放的路徑。再調(diào)用requestFocus方法用于獲取焦點,最后再通過start方法啟動播放視頻。initvideo方法代碼如下:Code:顯示定位privatevoidinitLocalVideo(){vedio.setVideoURI(Uri.parse("android.resource://"+getResources().getResourcePackageName(R.raw.video)+"/raw/video"));vedio.requestFocus();vedio.start();}3.5.2方向盤轉角為了實現(xiàn)對方向盤轉角的獲取,需要借助手機的傳感器服務。本文利用手機的加速度傳感器來對車輛的方向盤轉角進行模擬。加速度傳感器中的加速度是指重力加速度,當靜止時,重力傳感器的返回值與加速度傳感器的返回值相同,即返回X、Y、Z三個方向上的加速度值。如果手機平放在桌面上,則X軸方向加速度默認為0,Y軸方向加速度默認為0,Z軸方向加速度默認為9.81(這個值是由地球的固有重力決定的)。把手機朝下放在桌上,z軸是-9.81。將手機向右傾斜,x軸為負值。將手機向上傾斜,y軸為負值。將手機向下傾斜,y軸為正值。要調(diào)用手機加速度傳感器對車輛的方向盤轉角進行模擬,首先需要初始化傳感器服務,并實現(xiàn)SensorEventListener接口,具體步驟為:創(chuàng)建一個SensorManager來獲取系統(tǒng)的傳感器服務,再為加速度傳感器注冊監(jiān)聽器。實現(xiàn)SensorEventListener接口中的onSensorChanged方法與onAccuracyChanged方法。在onSensorChanged方法中使用event.values[]獲取傳感器在x、y、z軸上的分量大小。其中event.values[0]代表x軸分量,event.values[1]代表y軸分量,event.values[2]代表z軸分量。上述步驟的具體代碼為:Code:顯示定位 sm=(SensorManager)getActivity().getSystemService(Context.SENSOR_SERVICE);

sm.registerListener(this,sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);在完成以上步驟后,就可以在onSensorChanged方法中使用加速度傳感器的值,本文通過使用加速度傳感器在y軸方向分量來模擬車輛方向盤的轉角。為了顯示方向盤轉角的大小并對其進行可視化,先通過root.findViewById方法獲取布局文件中的TextView以及ImageView,分別以文字和圖片的方式來實時顯示方向盤轉角的變化。對于TextView,對其進行初始化后調(diào)用其setText方法,并傳入event.values[1]參數(shù),即方向盤的轉角大小,來設置顯示當前方向盤轉角大小,通過在手機端進行的測試,此時event.values[1]的值與相應的方向盤旋轉角度的值不相同,需要將event.values[1]的值乘以9.174,因此將方向盤圖片旋轉的角度為event.values[1]*9.174。對于ImageView,在對其進行初始化后,為了能夠讓方向盤的圖片能夠直觀顯示當前方向盤轉角的狀態(tài),通過根據(jù)當前方向盤轉角來對圖片實時旋轉的方法來完成。此部分代碼:Code:顯示定位 mtextViewy.setText("當前方向盤\n旋轉角度為:"+y+"°");//以文字顯示當前轉角大小fang.setRotation(event.values[1]*9.174f);//對方向盤圖片進行旋轉3.6車輛狀態(tài)信息的獲取與顯示為實現(xiàn)車輛狀態(tài)信息的獲取,在布局文件中編寫fragment_notifications.xml,整個界面采取垂直方向的LinearLayout布局,在里面包含了RadioGroup,RadioGroup采用水平布局并在RadioGroup中放置三個RadioButton,使用戶在同一時間只能選擇“車速”、“油量”、“擋位”三項中的一項進行顯示。在RadioGroup下方嵌套水平方向的LinearLayout并在其中放置兩個按鈕Button“接收”、“結束”分別完成接收UDP數(shù)據(jù)報和結束接收UDP數(shù)據(jù)報的功能。Button再在下方嵌套RelativeLayout放置三個com.github.mikephil.charting.charts.LineChart,分別用于顯示車速、油量、擋位的可視化圖表,并在com.github.mikephil.charting.charts.LineChart下方放置兩個TextView,分別用于顯示接收到的數(shù)據(jù)報內(nèi)容和當前的車輛狀態(tài)信息,整個界面的設計如圖3-10所示。圖3-10車輛狀態(tài)信息獲取與可視化界面圖本文通過網(wǎng)絡編程來獲取車輛狀態(tài)信息數(shù)據(jù),利用UDP協(xié)議來完成對車輛狀態(tài)信息的傳輸和獲取。UDP是非面向連接的提供不可靠的數(shù)據(jù)包式的數(shù)據(jù)傳輸協(xié)議。其數(shù)據(jù)的傳遞過程類似于從郵局發(fā)送信件的過程,發(fā)送信件是通過郵局系統(tǒng)進行傳遞,中間也有可能丟失。在Android中UDP協(xié)議可以通過使用DatagramSocket、DatagramPacket兩個類來完成收發(fā)報文的操作,其中DatagramSocket表示數(shù)據(jù)報套接字,可以它來創(chuàng)建數(shù)據(jù)報套接字并將其綁定到本地主機上的指定端口。DatagramPacket表示數(shù)據(jù)包,可以利用它來用來接收數(shù)據(jù)包。表3-8和3-9給出了車輛狀態(tài)信息獲取過程中用到的對象和方法。類名對象名說明Threadthread新建子線程DatagramSocketSocketUDP協(xié)議的SocketDatagramPacketpacket數(shù)據(jù)包Messagemsg包含數(shù)據(jù)對象的消息,用于傳遞給HandlerStringreceive以utf-8編碼接收到的數(shù)據(jù)包中的數(shù)據(jù)表3-8車輛狀態(tài)信息獲取過程中用到的對象方法名說明socket.receive(packet)接收數(shù)據(jù)包mHandler.sendMessage(msg)將數(shù)據(jù)發(fā)送到Handler中用于后續(xù)更新UI表3-9車輛狀態(tài)信息獲取過程中用到的方法為了通過利用UDP協(xié)議實現(xiàn)車輛狀態(tài)信息的獲取,具體采取以下步驟來完成:新建一個子線程用于完成UDP報文的接收操作。在子線程中需要選擇一個手機端的端口號用于接收數(shù)據(jù)包,構造DatagramSocket對象。創(chuàng)建發(fā)送的DatagramPacket數(shù)據(jù)包對象。調(diào)用DatagramSocket對象的receive(datagramPacket)方法,構造String對象接收通過receive方法收到的UDP報文,將其轉碼為UTF-8格式。具體代碼如下:Code:UDP通信獲取車輛狀態(tài)信息Threadthread=newThread(){

@Override

publicvoidrun(){

try{

socket=newDatagramSocket(PhonePort);

}catch(SocketExceptione){

e.printStackTrace();

}

byte[]receBuf=newbyte[1024];

packet=newDatagramPacket(receBuf,receBuf.length);

while(stopReceiver==false){

try{

socket.receive(packet);

Stringreceive=newString(packet.getData(),0,packet.getLength(),"utf-8");

Messagemsg=newMessage();

msg.obj=receive;

mHandler.sendMessage(msg);

}catch(IOExceptione){

e.printStackTrace();

}

}

}

};通過上述步驟接收到UDP報文中的車輛狀態(tài)信息后,需要對這些信息進行顯示并進行可視化處理。但由于Android中無法直接通過子線程來進行UI更新操作,還需要使用Android中提供的異步消息處理機制Handler來更新UI。表3-10和3-11說明了Handler類中用到的對象和方法。類名對象名說明TextViewmessage顯示UDP收到的數(shù)據(jù)包內(nèi)容float(變量)sp1、sp2、sp3、sp4存儲速度信息可視化圖表中各點的y軸坐標值float(變量)oi1、oil2、oil3、oil4存儲油量信息可視化圖表中各點的y軸坐標值float(變量)ge1、ge2、ge3、ge4存儲擋位信息可視化圖表中各點的y軸坐標值float(變量)speed、oil、gear存儲UDP收到的最新速度、油量、擋位的值Stringmes存儲子線程中發(fā)來的數(shù)據(jù)包表3-10Handler中用到的對象方法名說明Speed=Float.parseFloat(mes.substring(0,5))提取數(shù)據(jù)包中的前5位字符作為車速的大小oil=Float.parseFloat(mes.substring(5,8))提取數(shù)據(jù)包中的6-8位字符作為油量的大小gear=Integer.parseInt(mes.substring(8,9))提取數(shù)據(jù)包中的第9位字符作為擋位的大小message.setText在界面中顯示收到的UDP數(shù)據(jù)包內(nèi)容表3-11Handler中用到的方法車輛狀態(tài)信息獲取的具體實現(xiàn)步驟如下:在子線程中構造message對象,message是Handler接收與處理的消息對象。構造mHandler類繼承handler類,通過復寫handlerMessage()方法,編寫代碼來完成更新UI的操作。在子線程中設置好的消息,由handler發(fā)送出去:handler.sendMessage(message),就可以在mhandler類中使用子線程中傳遞的message中的數(shù)據(jù)。handler類代碼如下:Code:Handler類classmHandlerextendsHandler{

//通過復寫handlerMessage()從而確定更新UI的操作

@Override

publicvoidhandleMessage(Messagemsg){

message.setText("socket收到車輛信息:"+(String)msg.obj);

mes=(String)msg.obj;

speed=Float.parseFloat(mes.substring(0,5));

oil=Float.parseFloat(mes.substring(5,8));

gear=Integer.parseInt(mes.substring(8,9));

sp1=sp2;

sp2=sp3;

sp3=sp4;

sp4=speed;

oi1=oi2;

oi2=oi3;

oi3=oi4;

oi4=oil;

ge1=ge2;

ge2=ge3;

ge3=ge4;

ge4=gear;

}

}為了識別數(shù)據(jù)包中不同類型的車輛狀態(tài)信息,本文通過對數(shù)據(jù)包中不同位的數(shù)據(jù)進行劃分來表示不同的車輛狀態(tài)信息。規(guī)定數(shù)據(jù)包中第1到5位字符串表示車速大小,第6到8位字符串表示當前油量剩余,第9位字符串表示當前車輛的擋位。例如52.350692表示當前車速為52.35km/h,當前油量剩余69%,當前擋位為2擋。有了以上對數(shù)據(jù)包數(shù)據(jù)的規(guī)定,本文在handler的handleMessage方法中通過TextView對象的setText方法在界面中顯示手機收到的報文。再通過將從子線程中接收到message轉換為字符串對象,利用String對象的substring方法對數(shù)據(jù)包中不同位的數(shù)據(jù)進行提取分別賦值給存儲車速、油量、擋位信息的float型變量,便于后續(xù)顯示以及可視化。3.7車輛狀態(tài)信息的可視化3.7.1方向盤數(shù)據(jù)的可視化為了實現(xiàn)對車輛狀態(tài)信息的可視化,本文利用MPAndroidChart將車輛狀態(tài)信息以線型圖的方式顯示出來,對于方向盤轉角,其顯示的數(shù)據(jù)來源為加速度傳感器的event.values[1],event.values[1]將根據(jù)手機的轉角實時變化,對于車輛的速度、油量、擋位信息的監(jiān)控,將根據(jù)UDP每次獲取的報文對圖表進行更新,每收到一次UDP報文則對圖表進行一次更新,以對車輛狀態(tài)信息進行實時顯示。MPAndroidChart是一個強大的Android圖表庫,可以提供線圖和餅狀圖,支持選擇、縮放和拖放等功能。為了在AndroidStudio項目中集成MPAndroidChart庫,需要在Project的build.gradle里添加如下代碼:Code:配置build.gradle文件allprojects{

repositories{

jcenter()

maven{url"https://jitpack.io"}

}

}添加完上述代碼后對項目進行SYNC操作,將自動下載MPAndroidChart庫,對MPAndroidChart庫添加之后,編寫代碼實現(xiàn)對方向盤轉角的顯示,表3-12和表3-13說明了方向盤數(shù)據(jù)可視化過程中用到的對象和方法。類名對象名說明ArrayList<Entry>entry存儲Entry數(shù)組Entryc1e1-c1e7存儲數(shù)據(jù)坐標值LineDataSetData存儲坐標的數(shù)據(jù)集LineDatage1、ge2、ge3、ge4與折線圖關聯(lián)的所有數(shù)據(jù)的數(shù)據(jù)對象LineChartmylineChart線型圖對象Stringmes存儲子線程中發(fā)來的數(shù)據(jù)包表3-12方向盤數(shù)據(jù)可視化用到的對象方法名說明mylineChart.setData(lineData)設置線性圖的數(shù)據(jù),進行顯示mylineChart.invalidate()刷新圖表表3-13方向盤數(shù)據(jù)可視化用到的方法通過以下步驟實現(xiàn):設置數(shù)據(jù),構造動態(tài)數(shù)組List<Entry>entry以及Entry對象,Entry對象存儲圖表數(shù)據(jù)點的x、y軸坐標。調(diào)用數(shù)組List<Entry>entry的add方法動態(tài)添加entry。構造數(shù)據(jù)集LineDataSet的對象,傳入數(shù)組List<Entry>entry作為參數(shù),構造LineData,對象,將數(shù)據(jù)集添加到LineData中,再調(diào)用LineChart的setData方法,傳入LineData對象,在圖表中顯示數(shù)據(jù)。此部分代碼如下:Code:配置build.gradle文件List<Entry>entry=newArrayList<Entry>();

Entryc1e1=newEntry(1,c2e1);

Entryc1e2=newEntry(2,c2e2);

Entryc1e3=newEntry(3,c2e3);

Entryc1e4=newEntry(4,c2e4);

Entryc1e5=newEntry(5,c2e5);

Entryc1e6=newEntry(6,c2e6);

Entryc1e7=newEntry(7,c2e7);

entry.add(c1e1);

entry.add(c1e2);

entry.add(c1e3);

entry.add(c1e4);

entry.add(c1e5);

entry.add(c1e6);

entry.add(c1e7);

LineDataSetdata=newLineDataSet(entry,"方向盤的角度變化");

LineDatalineData=newLineData(data);

mylineChart.setData(lineData);在每顯示一次當前的圖表數(shù)據(jù)后,使用Entry類的setY方法將變量c2e1-c2e7的值分別賦給c1e1-c1e7的y軸坐標值,再將當前c2e2-c2e7分別賦給c2e1-c2e6,將c2e7的值更新為當前方向盤轉角的大小,以更新圖表數(shù)據(jù),對圖表進行刷新,使得圖表能夠達到實時顯示方向盤轉角大小的目的。Code:配置build.gradle文件c1e1.setY(c2e1);

c1e2.setY(c2e2);

c1e3.setY(c2e3);

c1e4.setY(c2e4);

c1e5.setY(c2e5);

c1e6.setY(c2e6);

c1e7.setY(c2e7);

c2e1=c2e2;

c2e2=c2e3;

c2e3=c2e4;

c2e4=c2e5;

c2e5=c2e6;

c2e6=c2e7;

c2e7=(float)(Y_longitudinal*9.174+90);

mylineChart.invalidate();3.7.2其他車輛狀態(tài)信息的可視化其他車輛狀態(tài)信息的可視化與上述方向盤數(shù)據(jù)的可視化方法基本相同,通過定義三個List<Entry>entry對象用于存儲三個圖表的數(shù)據(jù),分別構造三個數(shù)據(jù)集,在三個數(shù)據(jù)集中添加List<Entry>entry,最后再將每次從UDP獲取的車輛狀態(tài)信息數(shù)據(jù)通過添加到數(shù)據(jù)集中進行顯示。需要注意的是,其他車輛狀態(tài)信息的可視化與方向盤數(shù)據(jù)可視化存在一些差別,方向盤數(shù)據(jù)可視化利用的傳感器數(shù)據(jù)隨手機轉角變化而實時進行變化,即傳感器一直都在采集手機轉角的大小,所以可以根據(jù)需要的時間間隔進行采集進行顯示,對圖表進行實時更新。而其他車輛狀態(tài)信息,如車速、油量、擋位的數(shù)據(jù)是通過UDP方式從服務器端發(fā)送來的,在手機端每接收到一次報文則進行對圖表更新一次。該過程可由圖3-11表示。圖3-11其他車輛狀態(tài)信息的可視化過程其他車輛狀態(tài)信息的可視化的代碼如下(僅列出車速變化可視化的代碼,其他兩種狀態(tài)信息的可視化代碼與此基本相同):Code:配置build.gradle文件List<Entry>entry1=newArrayList<Entry>();

Entryspeed1=newEntry(1,0);

Entryspeed2=newEntry(2,0);

Entryspeed3=newEntry(3,0);

Entryspeed4=newEntry(4,0);

speed1.setY(sp1);

speed2.setY(sp2);

speed3.setY(sp3);

speed4.setY(sp4);

entry1.add(speed1);

entry1.add(speed2);

entry1.add(speed3);

entry1.add(speed4);

LineDataSetdata1=newLineDataSet(entry1,"車輛速度變化");

LineDatalineData1=newLineData(data1);

mylinespeed.setData(lineData1);

mylinespeed.notifyDataSetChanged();

mylinespeed.invalidate();sp1,sp2,sp3,sp4分別用于存儲x坐標分別為1、2、3、4點的y坐標,并在handler類中,通過以下代碼來實現(xiàn)對y軸坐標的更新,其中speed是通過udp最新獲取到的車輛速度的大小。sp1=sp2;

sp2=sp3;

sp3=sp4;

sp4=speed;3.8本章小結本章是本論文的核心章節(jié),首先介紹了Android開發(fā)環(huán)境的搭建,接著對本文在AndroidStudio中開發(fā)的項目文件結構以及文件的作用進行了闡述。其次,詳細地介紹了車輛監(jiān)控系統(tǒng)APP各個界面的設計過程,并給出了每個部分的代碼部分。

4車輛監(jiān)控系統(tǒng)的測試在完成車輛監(jiān)控系統(tǒng)APP代碼的編寫后,在Androidstudio菜單的build欄中選擇GenerateSignedBundle/APK進行APP的打包,如圖4-1所示。圖4-1Build欄彈出窗口后需要創(chuàng)建密鑰庫及密鑰,點擊createnew生成密鑰后,再點擊next后在如圖4-2所示窗口中選擇“release”以及“V2”生成發(fā)布版APP,點擊finish。圖4-2生成發(fā)布版APP窗口AndroidStudio提示生成apk文件完成之后,在項目目錄下的app\release中就能看到.apk文件,如圖4-3所示。之后再將此apk文件安裝到手機上,對車輛監(jiān)控系統(tǒng)進行測試。圖4-3apk文件圖4.1用戶注冊登錄功能測試在Android手機中,用戶點擊應用程序圖標后,將進入用戶注冊登錄界面,如4-4所示。圖4-4登錄功能測試圖用戶如果還未注冊用戶名和密碼,可以點擊“注冊”按鈕,跳轉到注冊界面,并在注冊界面填入相應的用戶名、密碼、手機號、郵箱信息,如圖4-5所示。在信息填入完成后點擊注冊按鈕返回登錄界面。圖4-6注冊完成后返回登錄界面圖4.2地圖定位功能的測試用戶在登錄界面登錄成功后將進入車輛監(jiān)控系統(tǒng)的主界面,如圖所示。當前屏幕的上方顯示了地圖,下方顯示了車輛的定位信息,點擊地圖中的“定位”按鈕后,地圖將跳轉到車輛所處的位置上,并以藍色圖表標注具體的地理位置,此外用戶還可以根據(jù)自己的需要滑動地圖,進行放大、縮小、平移等操作。4.3車載視頻和方向盤功能的測試用戶通過屏幕下方的導航欄選中“車輛狀態(tài)”后,將跳轉到車載視頻與方向盤監(jiān)控的界面,點擊上方的“車載監(jiān)控視頻”按鈕后,將自動播放視頻,如圖4-8所示。圖4-8車載監(jiān)控視頻點擊“方向盤”按鈕后將顯示當前方向盤的旋轉角度,方向盤的圖片也將根據(jù)當前的旋轉角度進行旋轉,如圖4-9所示。圖4-9方向盤點擊“方向盤變化”按鈕后,將以圖表的方式顯示目前的方向盤轉角大小,并實時進行更新,如圖4-10所示。圖4-10方向盤圖表數(shù)據(jù)4.4車輛狀態(tài)信息獲取以及可視化測試服務器端通過利用NetFox來通過UDP進行數(shù)據(jù)發(fā)送的測試,NetFox是一個可以進行UDP發(fā)送數(shù)據(jù)包的工具,其界面如圖4-11所示。圖4-11NetFox界面點擊上方的“系統(tǒng)”-“設置”,配置使用的IP地址以及端口,如圖4-12所示。圖4-12NetFox配置UDP選項配置完成后,點擊“系統(tǒng)”-“啟動”,然后在窗口下方選擇“發(fā)送”,在“發(fā)送到”框中輸入用戶使用的Android手機的IP地址以及端口號,并在下方的文本框中輸入要發(fā)送的數(shù)據(jù)030.30892后,根據(jù)APP設計過程中對數(shù)據(jù)包數(shù)據(jù)的規(guī)定,這個數(shù)據(jù)表示當前車速為30km/h,油量剩余為89%,車輛的擋位處于2擋,按回車鍵可將數(shù)據(jù)發(fā)送,如圖4-13所示。圖4-13NetFox發(fā)送數(shù)據(jù)此時將在Android手機端的車輛狀態(tài)信息界面點擊“接收”按鈕開始接收UDP數(shù)據(jù)報數(shù)據(jù),在服務器端發(fā)送數(shù)據(jù)后,將顯示接收到的報文內(nèi)容,并將報文內(nèi)容進行解析,提取為車速、油量、擋位信息,進行顯示,分別點擊“車速”、“油量”、“擋位”按鈕,將分別顯示車輛的信息以及圖表,如圖4-14、圖4-15、圖4-16所示,分別顯示了車輛的車速、油量、擋位信息。圖4-14車輛車速信息的顯示圖4-15車輛油量信息的顯示圖4-16車輛擋位信息的顯示進行多次的數(shù)據(jù)包發(fā)送后,圖表將顯示根據(jù)每次收到的數(shù)據(jù)繪制線性圖,如圖4-17所示圖表顯示了車速變化的信息。圖4-17車速變化圖4.5本章小結對車輛監(jiān)控系統(tǒng)設計完成后,本章通過在Android手機上對APP的各功能依次進行測試,將APP運行結果以截圖的形式進行展示。測試結果表明,本系統(tǒng)能夠完成畢業(yè)設計課題的設計目標,達到了預期的效果。

5結論與展望5.1結論在車輛不斷朝著智能化、信息化發(fā)展的今天,伴隨著城市交通的大發(fā)展,車輛數(shù)量正以驚人的速度增長,給交通管理帶來了許多問題。車輛監(jiān)控系統(tǒng)為解決車輛監(jiān)控管理問題提供了很好的方案?;贏ndroid平臺開發(fā)車輛監(jiān)控系統(tǒng),使系統(tǒng)功能更加完善,不僅為用戶了提供便攜性的支持,而且很大程度上提高了用戶對于車輛進行監(jiān)控的效率,具有廣闊的應用前景。本文對基于Android、百度地圖API、無線通信、數(shù)據(jù)庫存儲、數(shù)據(jù)可視化等多種技術對車輛監(jiān)控系統(tǒng)進行了研究,設計了車輛監(jiān)控系統(tǒng)終端的APP,以模擬的方式獲取車輛信息后將這些信息實時顯示。APP具有開放式體系結構和良好人機界面,易于擴展和維護,實現(xiàn)了在Android端對車輛進行監(jiān)控管理。本文具體完成的工作如下:利用SQLite數(shù)據(jù)庫存儲技術構建了存儲用戶注冊信息的數(shù)據(jù)庫,并結合SharedPreferences實現(xiàn)了“記住密碼”的功能。將用戶注冊信息添加到數(shù)據(jù)庫中完成了注冊功能,注冊信息與登錄信息進行匹配,實現(xiàn)了登錄功能,為用戶對車輛監(jiān)控系統(tǒng)的使用提供了一定的安全性保護,提高APP功能的完整性。調(diào)用百度地圖API,初始化百度地圖SDK后,在屏幕中顯示地圖。以手機位置來模擬車輛位置的條件下,通過獲取網(wǎng)絡和定位權限,完成對車輛位置定位的功能,并在地圖下方以文字方式顯示具體的地理位置定位信息。通過本地視頻來模擬車載視頻的播放,并調(diào)用手機的加速度傳感器對車輛的方向盤進行模擬,實時顯示方向盤轉角的大小,此外還對方向盤圖片實時旋轉達到使用戶能夠實時看到目前方向盤的旋轉具體情況的效果。新建子線程編寫UDP網(wǎng)絡接口,用來獲取服務器發(fā)來的車輛狀態(tài)信息,并將這些車輛狀態(tài)信息數(shù)據(jù)傳到Handler類中來更新UI,顯示車輛狀態(tài)信息。結合開源的MPAndroid庫,對車輛狀態(tài)信息數(shù)據(jù)進行可視化處理,將車輛狀態(tài)信息繪制成圖表,對圖表實時的更新。5.2展望從改進的角度來看,如果需要進一步完善系統(tǒng)的功能,為用戶提供更好的服務,可以從以下幾個方面進行對車輛監(jiān)控系統(tǒng)進行功能上的補充:1、結合百度地圖提供的基于鷹眼提供的接口和云端服務,構建一套軌跡管理系統(tǒng),使得用戶可以對車輛的行駛軌跡等進行分析。2、考慮建立云數(shù)據(jù)庫,將用戶的注冊信息、車輛狀態(tài)信息、可視化信息通過云數(shù)據(jù)進行存儲,使得企業(yè)、單位等可以對龐大的車群進行管理,并利用這些數(shù)據(jù)結合大數(shù)據(jù)技術進行分析。3、在真實的車輛端組建車輛數(shù)據(jù)采集系統(tǒng),進行硬件方面的設計,將車輛數(shù)據(jù)通過無線網(wǎng)絡發(fā)到手機上,構建一套完整的車輛監(jiān)控系統(tǒng)。參考文獻楊洋.城市智能交通系統(tǒng)的發(fā)展現(xiàn)狀與趨勢探討[J].城市建設理論研究(電子版),2020(11):53.于中天.淺談Android應用軟件與未來發(fā)展趨勢[J].數(shù)字化

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論