逢甲大學通訊工程學系專題研究 Android 程式之 GPS 應用 專題週記 0511 學生姓名 陳彥儒 D0035131 廖元譽 D0077791 指導老師 楊豐瑞老師繳交日期 2014.05.11
1 匯入 GoogleMap 1.1 取得授權步驟 目前進度 取得 Google 授權鑰匙 實作程式尚未成功 1.1.1 建立個人的 keystore
1.1.2 由個人的 keystore 查詢 SHA1 碼 1.1.3 利用 SHA1 碼至 Google apis 網站申請 key
2 寫入指定文字到 SD 卡 2.1 流程 目前進度 目前用出把程式裡的文字敘述 放到 sdcard 新增的 txt 檔裡 還未達成目標能夠在模擬器上寫入與讀取 SD 卡上的.txt 文件檔 寫入文字檔須使用 java 當中的 FileWriter 寫入單位為 char 產生物件方式為 : FileWrite FWriter = new FileWriter( /sdcard/output.txt,false) 第一個參數為檔案名稱及路徑 第二個參數為寫入模式是否為 append( 附加方式寫檔 )(False 表示寫入的資料會覆蓋掉檔案原有的內容 若設為 True 則表示用附加的方式寫到檔案原有內容之後 ) 除了使用 FileWriter 外 常會搭配使用 BufferedWriter 與 FileWriter 不同之處在於 Buffer 機制 當只用 FileWriter 寫檔時 每次呼叫 write() 當會動用到 I/O 假若使用 Buffer 機制來做 write() 會先將要寫入的檔案暫時暫存起來 等到一定資料量之後在寫入磁碟 因此可以省下不少 I/O 的負擔
2.2 匯入權限 2.3 程式碼 要先在 AndroidManifest.xml 加入 SD 卡的使用權限 讓我們可以寫入資料與讀取資料 <uses-permission android:name="android.permission.write_external_storage"/> package com.vince.test; import java.io.bufferedwriter; import java.io.file; import java.io.filewriter; import java.io.ioexception; import android.app.activity; import android.os.bundle; import android.os.environment; public class MainActivity extends Activity /** Called when the activity is first created. */ @Override public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview( R.layout.main ); try FileWriter fw = new FileWriter("/sdcard/output.txt", false); BufferedWriter bw = new BufferedWriter(fw); // 將 BufferedWeiter 與 FileWrite 物件做連結 bw.write("hello, Sih! Hello, Android!"); bw.newline(); bw.close(); catch(ioexception e) e.printstacktrace();
2.4 結果 用 CMD 內 adb shell 查看所建立的 output.txt 是否成功 Adb 指令列出目前開啟模擬器 列出虛擬機器中所有的檔案目錄
進入 sdcard 目錄 開啟 output.txt 檔案 輸入 ls 可以看到手機內目前所有資料夾 在主程式內設定了文字檔存放的位置 "/sdcard/output.txt" 所以在此會先看到 sdcard 資料夾 裡頭建立了 output.txt 並且寫入了程式碼內的 Hello, Sih! Hello, Android!
3 寫入任意文字並且可以讀取 3.1 說明 3.2 程式碼 可以自由的輸入任意文字並儲存到 SD 記憶卡中 並且能隨時從中呼叫出來 主程式 MainActivity.java package com.vince.test2; import java.io.bufferedreader; import java.io.file; import java.io.filereader; import java.io.filewriter; import android.app.activity; import android.app.actionbar; import android.app.fragment; import android.os.bundle; import android.os.environment; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.button; import android.widget.edittext; import android.widget.textview; import android.widget.toast; import android.os.build; public class MainActivity extends Activity // 寫入按鈕與讀取按鈕
private Button msetbtn, mgetbtn; // 輸入儲存文字的 EditText private EditText medit; // 顯示讀取文字的 TextView private TextView mtext; @Override protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); msetbtn = (Button) findviewbyid(r.id.setbtn); medit = (EditText) findviewbyid(r.id.edit); mgetbtn = (Button) findviewbyid(r.id.getbtn); mtext = (TextView) findviewbyid(r.id.text); msetbtn.setonclicklistener(new OnClickListener() public void onclick(view v) try File msdfile = null; // 檢查有沒有 SD 卡裝置 if(environment.getexternalstoragestate().equals( Environment.MEDIA_REMOVED)) Toast.makeText(MainActivity.this, " 沒有 SD 卡!!!", Toast.LENGTH_SHORT ).show(); return ; else // 取得 SD 卡儲存路徑 msdfile = Environment.getExternalStorageDirectory(); // 建立文件檔儲存路徑
"/MyAndroid"); File mfile = new File(mSDFile.getParent() + "/" + msdfile.getname() + // 若沒有檔案儲存路徑時則建立此檔案路徑 if(!mfile.exists()) mfile.mkdirs(); // 取得 medit 文字並儲存寫入至 SD 卡文件裡 FileWriter mfilewriter = new FileWriter( msdfile.getparent() + "/" + msdfile.getname() + "/MyAndroid/Pubby.txt" ); mfilewriter.write(medit.gettext().tostring()); mfilewriter.close(); Toast.makeText(MainActivity.this, " 已儲存文字 ", Toast.LENGTH_SHORT).show(); catch (Exception e) ); mgetbtn.setonclicklistener(new OnClickListener() public void onclick(view v) try // 取得 SD 卡儲存路徑 File msdfile = Environment.getExternalStorageDirectory(); // 讀取文件檔路徑 FileReader mfilereader = new FileReader(mSDFile.getParent() + "/" + msdfile.getname() + "/MyAndroid/Pubby.txt"); BufferedReader mbufferedreader = new BufferedReader(mFileReader); String mreadtext = ""; String mtextline = mbufferedreader.readline();
// 一行一行取出文字字串裝入 String 裡 直到沒有下一行文字停止跳出 while (mtextline!=null) mreadtext += mtextline+"\n"; mtextline = mbufferedreader.readline(); // 文字放入 mtext 裡 並清空 medit mtext.settext(mreadtext); Toast.makeText(MainActivity.this, " 已讀取文字 ", Toast.LENGTH_SHORT).show(); medit.settext(""); catch(exception e) ); 版面設計 main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="20dip" android:layout_gravity="center_vertical" android:gravity="center_vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 儲存文字 : " />
<EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint=" 請輸入儲存文字 " /> <Button android:id="@+id/setbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" 文字儲存至 SD 卡 " /> <TextView android:layout_width="match_parent" android:layout_height="1dip" android:background="#000000" android:layout_margintop="40dip" android:layout_marginbottom="40dip" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=" 讀取文字 : " /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/getbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=" 讀取 SD 卡文字 " />
</LinearLayout> 3.3 結果 3.3.1 文字儲存至 SD 卡
3.3.2 讀取 SD 卡文字
4 程式內嵌入 Google Map 4.1 流程 申請 Google Maps Android API key 另外載入 Google 服務 library
4.2 程式碼 主程式 MainActivity.java package com.wizozc25852.g_map; import android.app.activity; import android.os.bundle; import com.google.android.gms.maps.cameraupdatefactory; import com.google.android.gms.maps.googlemap; import com.google.android.gms.maps.mapfragment; import com.google.android.gms.maps.model.latlng; import com.google.android.gms.maps.model.marker; import com.google.android.gms.maps.model.markeroptions; public class MainActivity extends Activity static final LatLng NKUT = new LatLng(23.979548, 120.696745); private GoogleMap map; @Override protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.fragment_main); map = ((MapFragment) getfragmentmanager().findfragmentbyid(r.id.map)).getmap(); Marker nkut = map.addmarker(new MarkerOptions().position(NKUT).title("00").snippet("11")); map.movecamera(cameraupdatefactory.newlatlngzoom(nkut, 16));
界面檔 fragment_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" > <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.mapfragment" /> </RelativeLayout> 權限檔 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wizozc25852.g_map" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="14" android:targetsdkversion="19" /> <uses-feature android:glesversion="0x00020000" android:required="true"/> <uses-permission android:name="android.permission.internet"/> <uses-permission android:name="android.permission.access_network_state"/> <uses-permission android:name="android.permission.write_external_storage"/> <uses-permission android:name="com.google.android.providers.gsf.permission.read_gservices"/>
<application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="com.wizozc25852.g_map.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> <meta-data android:name="com.google.android.maps.v2.api_key" android:value="aizasyd_glwfn5_yuhemj-y7ijypsacyeju94je" /> </application> </manifest> 前面申請的 API key
4.3 結果 不知道為什麼錯誤的執行結果 手機上執行也是一樣 尚未解決
5 分工 5.1 匯入 GoogleMap 陳彥儒 5.2 寫入指定文字到 SD 卡廖元譽 5.3 寫入任意文字並且可以讀取廖元譽 陳彥儒 5.4 程式內嵌入 Google Map 陳彥儒