2011年8月29日 星期一

無法上傳程式至安卓市集

從星期日開始,就無法上傳程式到安卓市集,出現以下的錯誤。
想,可能是谷歌服務器的關係,就不理會,等一陣子再說吧! 等了一天,還是如此,想,會不會是週末放假了! 或是我們白天,美國晚上的關係,又等了一天,也上網查一下,是否有這方面的訊息或報導。結果,並沒有發現,到了今天早上,想,不該如此的,就換了一部電腦,結果....上傳正常。那就是電腦的問題了!!接著想,那換一個瀏覽器看看,換成火狐,卻出現另外一個問題。無法報到,出現如下訊息:
上面說,是Cookie的問題,或許是,就到IE去,把Cookie給刪了...結果仍然相同,看火狐上面的解釋,都是舊版本的說明,是否是IE9.0的原因呢???但是上傳圖片是好的,是權限的問題嗎?
先治標吧,到火狐,上傳程式,就正常了。




2011年8月9日 星期二

invalidate 部分畫面

寫了一個程式, 自己設計了一個view, MyView 繼承至View
在畫圖(onDraw())時, 座標的計算是相對座標, 例如, (0,0) 對應的是畫布的左上角, 但是在整個螢幕上, 並不是左上角。
在整個螢幕上,有二行,一行是系統的狀態行,一行是標題行。
找Google, 很容易可以找到指令。

Rect rectgle= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight= rectgle.top;
int contentViewTop=
window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight= contentViewTop - StatusBarHeight;

重點是:這些指令必須在view所在的thread中執行, 因此,如果你想要在Activity中執行,必須加上:

MyView.post(new Runnable() {
@Override
public void run() {
/* 將執行程式放在此處 */
}
});

另外一個方式是,直接放在View的onDraw()函數。
看起來好像可以用了, 但是,
Invalidate()會調用onDraw(), 沒有錯,
但限定範圍的Invalidate(範圍), 產生的結果卻很怪異,
通常前幾次 (幾乎都是三次,也出現過部分是一次),會畫整個畫面,如同invalidate() (没有參數),造成整個畫布的重劃,這些次數過後,就正常了,只重劃指定的部分。改成postInvalidate()也是相同,只是怪。
指定的操作是:
  1. 設定繪畫方法為call back
  2. 執行invalidate調用onDraw
  3. onDraw呼叫設定的繪畫方法

/**
* Show item is checked
* @param canvas
* @param date
* @param id
*/
public void ShowChecked(Canvas canvas, int date, int id) {
XY xy=this.getXY(date, id);
if(checked==null) {
checked = BitmapFactory.decodeResource(getResources(),R.drawable.yes);
checked = Bitmap.createScaledBitmap(checked,(int)(unit_width*0.8),(int)(unit_height*0.8), true);
}
canvas.drawBitmap(checked, xy.x+(unit_width*0.1f), xy.y, new Paint());
}
/**
* Call the ShowChecked from outside
* @param date
* @param id
*/
public void ShowChecked(final int date, final int id) {
action.add(new Action() {
@Override
public void GoDraw(Canvas canvas) {
ShowChecked(canvas,date,id);
}
});
this.invalidate(region(date,id));
}

2011年8月8日 星期一

態度養成進度: 畫面

花了將近半天的時間, 調整了一個不錯的結果, 效率, 其實可以更好一點。這個工作主要是:
1. 把手機螢幕調成橫的(landscape)。
2. 把這個畫面畫出來。
所謂態度養成,就是每天追蹤。讓我們的思想,變成習慣。

防弊不如興利

我是一個正版軟體的擁護者,尤其是國內的軟體。
我買過許多軟體,大家可能沒聽到。
中文Window 3.0,這是只有三天壽命,由資策會開發的軟天,說來話長了,花了NT$ 3000元。二十年前。
我曾是新翰藝的整套系統的用戶,從霹靂卡、彩虹卡到新翰藝雷射印表機,這是倚天正紅的時候的產品,花了就不知道多少個十萬了,在二十年前。
現在,我依然是。
Dr. Eyes, 譯典通, 因著微軟版本的不斷更新,我也不斷更新,也買了近十套的正版軟體,一般都在一千元上下。因著電腦的不穩定,總是要備份。備份,當然,就連著譯典通一起備份了下來。
問題來了,系統重貫時,這個譯典通一直無法註冊。
當然,我估計是這樣一個原因,譯典通把某一個驗證碼存到特定的地方,在備份時,並沒有備份下來,因此,一直保留在電腦裡,只是,系統回復時,譯典通程式認為要重新註冊,但是拿原來那一組註冊碼去註冊時,與電腦裡的儲存相同,拒絕接受,因此,就卡住了。
打擊罪犯,可能效果相反。為了防範小人,卻造成許多守法的人的不方便。就像是台北市政府,說要保護消費者,結果消費者不能買安卓市集的付費產品。就像許多政客,口口聲聲愛台灣,卻一步一步把台灣逼到死地。人生就是這麼吊詭。
如此一來,每次要回覆之後,都必須把譯典通移除重裝。真是不方便。與客服人員溝通,其實她不能決定什麼,問題是,這個大陸人,連話都不明白。也難為她了。客服人員難為。只是,如果用盜版,反而沒有問題,真是!@#$%︿&
記得高中老師說,人與人之間,70%的時間,用在防弊與猜忌。是嗎?
負擔得起的狀況下,我依然用正版。(負擔不起就考慮不要用)。
勿以善小而不為
勿以惡小而為之
願自己自我警惕 !!

以下是Google Sense廣告:

2011年8月7日 星期日

態度養成(Attitude Builder)

今天,開始《態度養成》應用軟件的開發。態度,就是思考的習慣。我們的判斷與決策,95%來自直覺。也就是習慣。也就是態度。態度決定了我們的決策品質。至關重要,我們明白,然而,如何改善我們的態度呢?
《心理制約》決定了我們的態度。
然而,又如何改變我們的《心理制約》呢?
答案是《間隔重覆》
換句話說:
【間隔重覆】 >> 【心理制約】 >> 【態度】
透過手機工具,追蹤我們的進行,進而養成態度。
例如每天希望早5點早起,每日早起,就在態度追蹤表上,打個勾。
連續實行了21次,就養成習慣了。
如果沒有做到呢? 就要思考一下,這個習慣真的是我們要的嗎? 還是可有可無。思考一下,養成了,有什麼好處?為什麼要養成這個習慣。如果沒有養成呢?有什麼損失,如果是可有可無,那就把它劃掉,我們不必列出來 “給別人看”。或是不斷提醒自己一件,自己不想做的事。


計劃在8/15日前上線. 定價 US$ 0.99元

珍珠生命(Pearly Life)發展計劃

夢想是人生的源頭。有幾個字,是有關的:
夢想、願望、願景、異像。有人說,由人來的,實際的是願望,虛幻的是夢想;由神來的是異像?是或不是,我不知道。天主教曾是追殺基督徒的元兇,基督徒之間,彼此的攻擊也不少,那些大牧者,或許就是作亂的源頭。或許有人明白,但是,我不明白。一切真理的源頭是神。因此,一切真理的實際操作是,禱告。佐之以讀經、交通。保持柔軟謙卑。
這是『我的禱告簿(com.sni.Prayer)』的由來。朋友的姪女,得到總統奬,二十萬,高中生。他說,他的姪女,每天禱告一個小時,一個小時,拿出禱告單,與神切切地交通,尋求神的旨意。這是我應該學習的。每天,依著禱告簿,好好的禱告。
禱告是與神交通,與神交通的目的是尋求神的旨意。神要我們做什麼?我們該做什麼?我們又不該做什麼?我們現在所行所是,對嗎?需要調整嗎?那些該做的我們沒有做?那些沒有做的我們該做?神的旨意,就是異像(我以為是)。異像的抽像,或是統整,就是『人生使命』這就是『我的願景板(com.sni.Vision)』的由來,我的願景板中包含了願景清單人生使命
有了願景,必須要有行動,因此有了以下,正在開發中的軟體:
  1. 分析評估:要達到目標,永遠有三個步驟:
    1. 了解,清楚了解,確實想要,要去那裡?
    2. 了解,深入了解,徹底明白,我在那裡?
    3. 思考,找到,從這裡如何到那裡?
  2. 有了評估分析,接著要採取行動,行動有三個要素:
    1. 目標與計劃,即是行動計劃,行動方案。
    2. 每個月的計劃,這是開始落實。
    3. 正確態度(思考的習慣)的養成
  3. 而所有的行動,都必須要落實在兩件事上
    1. 每日的行程規劃與進行。這就是行事曆。
    2. 每日的工作清單,工作清單來自於『月計劃』『目標計劃』『態度養成』等。



這就是我想要開發的Pearly Life (珍珠生命)的系統。人生的每一天,都應該像珍珠一般地去珍惜,妥善運用。

Android案例開發完全講義(共694頁)

今天,K完這本書,這是一本不錯的書。內容很紮實,而作者是一個有實際設計經驗的人,因此,讀起來,不空洞,很實在,也實際有收獲。對Android沒有認識想認識的人,或是有一些認識想更認識的人,至於高手,那就要看高到什麼程度了。

使用手機測試程式

工具:eclipse
手機:HTC Desire A8181
環境:Win7
用emulator來測試,當然很好。但是有一些與硬體實際相關的功能,或是,直接用手機測試,是否更『精準』一點。
好主意,試試,直接用手機來測試程式。
  1. 在Eclipse端的設定,必須在AndroidMenufest.xml加上可以在手機上測試的選擇,可以有二個方式選一,一個是直接改在xml上,如圖一,一個是在application標簽上,將debuggable設為true, 如圖二。
  2. 在電腦端要安裝驅動程式,這個驅動因手機而不同,在HTC,目前的版本是
    setup_3.0.5557
  3. 在手機端的設定,總共有二件事: 
    • 在設定/應用程式/勾選【未知的來源】,這表示,可以直接安裝apk, 而不須要都是透過android market.
    • 在設定/應用程式/開發,勾選【USB除錯中】
然後,你再執行eclipse的RUN/DEBUG, 就會出現選項,看要在實際的手機上或是模擬器上執行,而且,在手機上執行,仍然可以擷取畫面。Good!!

2011年8月4日 星期四

Android 市集

台北市政府和android market鬧翻了,付費的軟體,不能下載,因此,就只好考慮電信三雄的市集了。

遠傳S市集,入會費500元永久會員,支付扣除營業稅後的70%。
中華電信Softplaza, 無入會費,支付中華電信30%含稅佣金
台灣大哥大match Market, 網頁上沒有註明入會費及拆帳方式
中國移動mm (mobile market), 似乎沒有入會費,70%歸開發商

後記:
今天加入中華電信的 Softplaza, 清晨六點半加入的, 看什麼時候可以收到確認函。選擇中華電信的原因很簡單,因為免費。抽成30%己經很高了,再收費….實在….當然,還是老大說了算….

簽署APK

要放上android market的程式包(apk)必須要簽署,簽署的意義就是將程式設計者相關的資訊以加密的方式附在程式上。別人可以讀得到這些資料,但是不能修改。這樣有一個好處。就是有『產權糾紛』或『版權爭議』時,可以明確界定。使用eclipse開發,在沒有特殊設定時,是沒有簽署的,沒有簽署的程式,依然可以複製到手機上安裝使用。但是要放上android market就必須要簽署,簽署的方式也很簡單,已經整合到eclipse環境之中。
  1. 在所要上線的專案上按右鍵
  2. 選擇 Android tools / Export Signed Application Package…
  3. 接著按指示操作,第一次會要求產生一個store存放加密的鍵值
  4. 有了store後,會要求增加鍵(key)值,可以所有的應用程式共用一個鍵值,或是分群使用,在store及key值都會設定密碼,可以設成一樣或不一樣,在新增key值時,會要求輸入設計者相關的資料。就這樣了。

AdSense被取消

因為要寫收費的Android應用程式,所以必須申請
  1. Google Checkout
  2. AdSense
而申請AdSense需要一個網頁,因此,就依Google的建議,申請了一個blog

http://soundnetinternational.blogspot.com/

然後,向Google申請了一段廣告碼,放在程式後面。
<script type="text/javascript">
<!-- google_ad_client = "pub-2966378125551072";
/* 300x250, 已建立 2011/8/2 */
google_ad_slot = "2454852632";
google_ad_width = 300;
google_ad_height = 250; //-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
乖乖,用了一天,就被停掉了,然後,收到Google的來信:

您好:

如歡迎使用電子郵件所述,只要您開始放送廣告,我們就會開始審查您的 AdSense 帳戶。在我們最近一次審查中,您的帳戶因下列違規而被停權。

問題:
- Google AdSense Support
---------------------
詳細原因:
內容不夠豐富:若想符合加入 AdSense 的資格,您網站的文字內容必須充足;這樣一來,AdSense 專家才能進行審核,我們的檢索器也才能找出適合顯示在您網頁上的相關廣告。因此,我們建議您在網站上加入更多完整的文句和段落。根據規定,網站內容必須全面上線且正常運作,讓使用者能夠透過選單、網站導覽或適當的連結來瀏覽整個網站。只要您網站絕大部分都已完備且運作正常,我們會很樂意重審您的申請。

請注意,只有 AdSense 帳戶獲得核准的發佈商,才能使用 AdSense 網域廣告或 AdSense 網域廣告線上版。

所以,
  1. 網頁內容不足,申請AdSense就不過
  2. AdSense不過,Android Market就沒有辦法付帳
其實,現在也沒有什麼帳要收,而且台北市政府和Google鬧翻了,台灣也無法下載付費的軟體。而這個網頁才剛開,當然沒有什麼內容。自己也不想說什麼,遊戲規則既是如此,就寫一些內容放上去吧。Google這樣規定也無可厚非,但是,對於開發Android的開發商而言,一定要和AdSense綁在一起…..反正,老大說了就算。
  1. 2011/8/7 依Email所說,再提出升請,說,要一個星期或更久,FINE,就等等看。
  2. 2011/8/8 Email來函,授權通過,重新開放使用。
  3. 2011/8/9 重新申請了廣告碼,可是沒有連線上,出現以下訊息。上回剛開始也是如此,不過這次持續比較久。

Google為開發者提供的工具

放上市集的應用程式,在Google中有不錯的分析,會告訴你,有多少人正確安裝。這些人,使用那些廠牌的手機,使用那一個版本的作業系統,是從那一個區域(國家)下載,使用什麼語言。看到自己的程式被全世界使用,是一種快感。自己不是,也不想寫大家歡迎的應用程式,因此,也不期待一炮而紅,就希望,自己的努力,可以幫助一些人,實際、具體的幫助一些人。
自己的『我的禱告簿』,放上去15天,有45人使用。有趣。

static 的使用(在Android)

看自己放到Android Market上的程式,有錯誤報導。

java.lang.NullPointerException
at com.sni.Prayer.PrayerData.Update(PrayerData.java:148)
at com.sni.Prayer.WordActivity$6.onClick(WordActivity.java:173)
at android.view.View.performClick(View.java:2461)
at android.view.View$PerformClick.run(View.java:8888)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

而錯誤的程式是:

private static Cursor getWords(int prayerId) {
Cursor cursor=null;
try {
cursor = database.query(WORDS_TABLE, null, PRAYER_ID_IS+prayerId, null, null, null, null);
} catch(SQLException e) {
Log.e(TAG,e.getMessage());
}
return cursor;
}

Null Exception, 那當然就是database了,但是,為什麼如此? 執行到這一行,應該早就開啟了,為什麼沒有開啟呢? 當然,簡單加個 if(database==null) 的判斷是容易的,我的想法是,一定要找出原因,而且,不必執行的就不必執行,不要執行重覆的判斷。經過分析,發現:
自己很喜歡用static 變數,覺得
  1. 當作global來用
  2. 不必new就可以使用
  3. 只有一份記憶體,省空間
這個database類別,被自己搞成,每一個member都是static, 自己覺得不妥,但是懶得改,真是糟糕,給自己一個警惕。如果都是static, 沒有instance, 是否在記憶體管理時,會被整個御載,御載後再載入時,其static data member的值是否就沒了,變成null了,當然,改成每次讀的時候都check,這是一個方式,但是,這麼多了許多判斷。因此,保留data member 為static, 但是要使用這個資料的函數,都取消,不是static, 保留那些完全沒有使用資料成員的函數為static。每個Activity在調用時,必須先創建(new)一個instance。而在Constructor中加入判斷資料庫database是否為空的判斷。…OK
同時也想到,記憶體管理是以class, Activity為單位。因此,保留每一個類別的”完全”獨立,有助於記憶體管理。因此,將所有static改成private, 或是移到不是Activity的class中。

連續變換方向導致記憶體不足

發現自己開發的Android軟體,有一個問題。如果頻煩地更換方向,一下直,一下橫,多幾次,系統就出現異常錯誤。
因此,就追蹤了一下,直/橫的變化,系統作了些什麼? 結果發現,方向變化時,系統會執行onCreate(), 自己在onCreate中,讀數據庫,讀出列表,顯示在螢幕上,列表中,每一列又有圖標,這麼一下,來來回回,不斷重做,讀出的記憶體,沒有及時釋放,(自己一直不想去控制GC, Garbage Collection, 自己的程式還不是那麼大,殺雞焉用牛刀),結果系統就當掉了,因此,就想,那讀出來的資料就不要再讀了,做過的事,就不要再做了,因此,
  1. 第一個想到,就將變數移成class member, 在讀出來前,先判斷一下,是否為null, 若是null再重讀。
  2. 乖乖,結果相同,想當然耳,會執行onCreate(), 自然是重新產生一個instance,所有的data member當然被reset了,那怎麼辦?
  3. 那就用static,將這個變數鎖住,測試,對了正常了,怎麼變換都不會當了,只有第一次做,以後就不做了。可是有一個問題要處理。每一次啟動這個Activity, 變數將會保留上一個,也不會重新讀取(如果每次需要讀不同的資料)。
  4. 那把清空的動作加在onStop()好了,在結束時設為null, 下回進來就會重讀。測試,結果方向變化也會執行onStop()…..怎麼辦?
  5. 那試onDestroy()好了,方向變換應該不會進行”破壞”吧!很不幸地,方向變換時,依然執行了onDestroy(), 那怎麼辦?
  6. 這麼基本的需求,一定有解。結果發現,在onDestroy()中加上isFinishing()的判斷就好了,如果是方向變換,isFinishing()會傳回false, 如果是結束,就會傳回true。(在onStop()中做,應該也是可以的,想Stop()未必結束,只要沒有Destroy應該都不必重讀,放在onDestroy()中比較省功。

@Override
protected void onDestroy() {
/*
* When you change orientation, onDestroy will be invoked too.
*/
super.onDestroy();
if(this.isFinishing()) {
files=null;
index=0;
bm=null;
}
}

讀Bitmap導致記憶體不足

做一個Android應用程式, 可以更換不同的圖片, 以選擇一幅自己要的, 採用ImageSwitch, 經歷了幾個階段
  1. 一開始, 我使用Dialog來選擇圖片, 可以總選擇了幾個以後, 就出現異常錯誤, 後來用程式碼抓了一下, 發現是記憶體不足的錯誤。

    try {
    bm = BitmapFactory.decodeFile(files[index]);
    imvPickVisual.setImageBitmap(bm);
    } catch(Exception e) {
    Log.e(TAG,e.getMessage());
    } catch(OutOfMemoryError e) {
    Log.e(TAG,e.getMessage());
    }

    原來,有catch(Exception e), 並不能捕捉出記憶體不夠的錯誤,加了 catch(OutOfMemoryError e) 後,補捉到了這個錯誤,然而,為什麼如此呢?
  2. 第一個念頭是,會不會在Dialog中實現,在複雜了,導致錯誤? 因此就改用Activity來現實,在辛苦了一下之後,Dialog沒有了,直接啟動Activity,結果還是一樣。
    接著想,是否是ImageSwitcher的問題,自己用這個元件來實現,這個元件一開始調用了makeView()函數(而且被調用了兩次), 然後圖片轉換時,就不再調用了,是否ImageSwitcher必須要配合Gallery來使用? 因此就加上Gallery好了,結果在2.2版本中,左側的元件表是有Gallery, 但是,放入layout後,系統就說,找不到這個類別(class),必須重新定義,但是改成2.3版就正常了,既然這個元件在2.2版中有定義,也就不必自己在2.2來一回。
  3. 接著想,那改成ImageView好了,反正就只有簡單的,左劃下一張,右劃上一張,如此而己。又辛苦了一下,把ImageSwitcher改成ImageView, 結果仍然相同,選了幾張以後,就Out of memory了。
  4. 再爬一下網路,發現,原來罪魁禍首是 decodeFile(), 這個函數將整個圖片抓下來,釋放沒有及時,幾張圖後,記憶體就完了。要在decode時,加上scale, 而scale最好是2的指數,運算會比較快,實際decode的圖,會是原來圖的1/scale。因此,
    1. 先讀出圖的尺寸
    2. 決定scle
    3. 依scale來decode

    public static Bitmap decodeFile(File file, int max_size) {
    Bitmap bm = null;
    try {
    //Check the image size to be decode, to decide sample size
    BitmapFactory.Options op = new BitmapFactory.Options();
    op.inJustDecodeBounds = true;
    FileInputStream isFile = new FileInputStream(file);
    BitmapFactory.decodeStream(isFile, null, op);
    isFile.close();
    int scale = 1;
    if (op.outHeight > max_size || op.outWidth > max_size) {
    scale = (int) Math.pow(2, (int) Math.round(Math.log(max_size / (double) Math.max(op.outHeight, op.outWidth)) / Math.log(0.5)));
    }

    //Decode with inSampleSize
    op = new BitmapFactory.Options();
    op.inSampleSize = scale;
    isFile = new FileInputStream(file);
    bm = BitmapFactory.decodeStream(isFile, null, op);
    isFile.close();
    } catch(Exception e) {
    Log.e(TAG, e.getMessage());
    }
    return bm;
    }

2011年8月3日 星期三

我的願景板上線了!

昨天,我的願景板上線了。這是我的第一個收費的應用程式,收費0.99美元。這個錢,只有一點點,是跨越公益與商業的界線。因為台北政府為了保護台灣民眾,所以台灣民眾不能下載收費的應用程式。所以,大家目前仍然不能下載使用。
願景,是我們人生的指標。
願景,是讓我們好還要更好的幫助。
願景,是讓我們走過人生低谷的良藥。
願景,是讓我們喜樂的泉源。
願景,是讓我們奮鬥的力量。
願景,是讓我們心連心,手牽手,共同分享、只同努力的紅線。
許多人,在成功後,每下愈況。
許多人,在失敗後,一蹶不振。
許多人,痛苦渡日,怨天尤人。
就是因為,沒有好好地看顧好自己的願景。
因此,就想寫一個程式,隨身可用。
可以記錄、追蹤、實現,我們每一個願景。


新河願景板
我的禱告簿





新河願景板
我們有更詳細的使用說明,如果你有須要較為完整的使用說明,請Email給我,我會回傳給你。
faust.dehng@gmail.com


程式一開始, 會列出所有願景項目。你可以點選後進入該禱告項目之內容。底色表示願景相關的人生領域(身、心、靈、家、公、財、事),可以多選。底色將依所選的領域混色。
整個軟體在操作上的原則就是:
1.按{選單}(Menu)鍵可以調用其他的選項。
2.改什麼就點選什麼。
3.按{回復}(Back)鍵可以回上層選單。
4.在願景清單中,長按,可以有更多的選項。
資料會放在SD卡內 soundnet路徑中。


在願景清單中,點選,可以看到願景的詳細內容,每一個願景可以配一張視覺化圖像,顯示在左上角,如果點選,可以放大這張視覺化圖片,如果長按,可以更改這張視覺化圖片。你可以預先將圖片,放在SD卡內soundnet/picture路徑下,如此,在選擇上就會比較方便。目前提供選擇圖片(長按圖片),會有
1. 拍照的路徑 (SD卡內 DCIM 路徑)
2. 預設圖片路徑 (SD卡內 soundnet/picture)
3. SD卡之根路徑
供選擇,選持圖片時,可以
1. 往左劃/ 往右劃。
2. 點選這一張。