2016年12月24日 星期六

勤行小幫手 隱私權政策


隱私權政策

上次修改日期: 2016年12月24日
勤行小幫手的《隱私權政策》說明了下列事項:
1. 使用的功能
2. 功能的用途
3. 資料的使用
4. 資料的儲存

1. 使用的功能
安卓設備的麥克風錄音功能。

2. 功能的用途
勤行小幫手,使用到麥克風,進行錄製音檔。

3. 資料的使用與儲存
音檔會在播放功能,使用播放,用於練習自己的聲音與範例音檔做比對。

4. 資料的儲存
錄製的音檔,只會儲存在你當前的安卓設備裡;音檔不會儲存到設備以外的任何位置。

2016年4月6日 星期三

申請 Amazon Web Service EC2


要準備的東西 , 信用卡 , 英文地址 , 手機可接聽的門號

去 Amazon Web Service 網站 ,

https://aws.amazon.com/tw/

右上角按註冊 ,在 帳號位置 ,輸入你要申請加入 AWS 的 E-mail , 然後按 登入按鈕 ,


輸入你的信用卡資訊 , 以及 信用卡帳單地址(我是填英文的)



這裡是 身份確認 ,
1. 要填入 +8869xx111222 你的手機門號
2. AWS 會撥電話來 , 聽英文講完 , 輸入 PIN , 它就會跟你講 balabala Thank you.
3. 身份驗證完成



 這裡是選 支援方案 , 個人使用就先選免費的吧 !~



 這裡就完成了

善用工具軟體


去申請一個 LassPass 的帳號 ,

好處就是 , 統一由 LassPass 管理一組終極的帳密

方便 儲存業主的 Google / Apple 開發者帳密


2013年11月30日 星期六

使用 extends Activity , 建立 simple_list_item_2 (兩行顯示) 的 ListView

package com.example.gpsticker;

import java.util.ArrayList;
import java.util.HashMap;

import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class MainActivity extends Activity {
   
     ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
     private SimpleAdapter adapter;
     ListView listView01;
   
     private static final String[] mPlaces = new String[] {
     "台北市", "新北市", "台南市", "高雄市", "苗粟縣",
     "台北市", "新北市", "台南市", "高雄市", "苗粟縣",
     "台北市", "新北市", "台南市", "高雄市", "苗粟縣",
     "台北市", "新北市", "台南市", "高雄市", "苗粟縣",
     "台北市", "新北市", "台南市", "高雄市", "苗粟縣",
     "台北市", "新北市", "789", "cde", "abc"
     };
   
     private static final String[] mFoods = new String[] {
     "大餅包小餅", "蚵仔煎", "東山鴨頭", "臭豆腐", "潤餅",
     "豆花", "青蛙下蛋","豬血糕", "大腸包小腸", "鹹水雞",
     "烤香腸","車輪餅","珍珠奶茶","鹹酥雞","大熱狗",
     "炸雞排","山豬肉","花生冰","剉冰","水果冰",
     "包心粉圓","排骨酥","沙茶魷魚","章魚燒","度小月",
     "aaa","abc","bbb","bcd","123"
     };
   
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
        
         listView01 = (ListView)findViewById(R.id.listView1);

         //把資料加入ArrayList中
         for(int i=0; i<mPlaces.length; i++){
             HashMap<String,String> item = new HashMap<String,String>();
             item.put( "food", mFoods[i]);
             item.put( "place",mPlaces[i] );
             list.add( item );
         }
       
         //新增SimpleAdapter
         adapter = new SimpleAdapter(
                     this,
                     list,
                     android.R.layout.simple_list_item_2,
                     new String[] { "food","place" },
                     new int[] { android.R.id.text1, android.R.id.text2 } );
       
         //ListActivity設定adapter
         listView01.setAdapter( adapter );
       
         //啟用按鍵過濾功能,這兩行資料都會進行過濾
         listView01.setTextFilterEnabled(true);
       
       
         // 为ListView设置列表项点击监听器
         listView01.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, android.view.View view, int position, long id) {
            Toast.makeText(getApplicationContext(), "您点击的是:"+"第"+(position+1)+"项", Toast.LENGTH_SHORT).show();
            }
         });
   

     }
   
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


}

結果會如下 , 分隔線左右會有留空 , ListView 週邊有留空 , 另有一個物件





如果改用 extends ListActivity ,
1.
// setContentView(R.layout.activity_main); // 這行關掉

2.
         //listView01.setAdapter( adapter );   
     setListAdapter( adapter );

3.
         //listView01.setTextFilterEnabled(true);
         getListView().setTextFilterEnabled(true);

4. (不知如何取得 Click , 整個先關掉)
//         listView01.setOnItemClickListener(new OnItemClickListener() {
//
//            @Override
//            public void onItemClick(AdapterView<?> parent, android.view.View view, int position, long id) {
//            Toast.makeText(getApplicationContext(), "您点击的是:"+"第"+(position+1)+"项", Toast.LENGTH_SHORT).show();
//            }
//         });

結果就會是滿版的 ,





2013年9月21日 星期六

對 String ( 內容為 xml 標籤結構 ) , 使用特定 Tag 標籤 , 截取 substring 標籤的值


    String MyStream = "
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <TraExtendCar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Placemark>
            <SN>1</SN>
            <City>臺北市</City>
            <Area>南港區</Area>
            <Description>忠孝東路六段39號前(台電前)</Description>
            <Lat>25.04665</Lat>
            <Long>121.58366</Long>
            <Speed>50</Speed>
            <Extend>10</Extend>
            <Bearing>227</Bearing>
        </Placemark>
        <Placemark>
            <SN>2</SN>
            <City>臺北市</City>
            <Area>南港區</Area>
            <Description>忠孝東路六段188巷(東向西)</Description>
            <Lat>25.048832</Lat>
            <Long>121.587055</Long>
            <Speed>50</Speed>
            <Extend>10</Extend>
            <Bearing>255</Bearing>
        </Placemark>
            ";
// 以上 String 的建立 , 不是正確的 , 只是個方便看到內容的範例
   
    String Tag = "Description";
    String StartTag = "<" + Tag + ">";
    String EndTag = "</" + Tag + ">";
    int iStart = 0;
    int iEnd = 0;
    String strOut = "";
    iStart = MyStream.indexOf(StartTag)+StartTag.length();
    iEnd = MyStream.indexOf(EndTag);
    strOut = MyStream.substring(iStart, iEnd);










截取出 , 與 Tag 相同的標簽裡頭的 值 , 值會透過 substring 存於 strOut 裡
因來源應該是 xml 之類的文字檔 ,
值 的預設形態會是 String ,



以上不是 Bug Free , 還需要做 檢查 是否 標籤成對 的存在 ,
產生錯誤的測試為 , 使用不存在的標籤去跑程式 , 如
    String Tag = "Desc %$@ ription";

會產生 java.lang.NullPointerException 的錯誤









打上斷點(Toggle Line Breakpoint) , 透過 Debug 執行(Run下面那一個) ,
觀察 (x) = Variables ,
可見到 String indexOf 如果沒有找到 標籤 , 會回傳 -1 的值 ,





一個簡單的方法 , 用 try catch 包起來 ,
    try
    {
        String Tag = "Desc %$@ ription";
        String StartTag = "<" + Tag + ">";
        String EndTag = "</" + Tag + ">";
        int iStart = 0;
        int iEnd = 0;
        String strOut = "";
        iStart = MyStream.indexOf(StartTag)+StartTag.length();
        iEnd = MyStream.indexOf(EndTag);
        strOut = MyStream.substring(iStart, iEnd);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

程式可以繼續往下走 , 不會報錯而中斷



純文字檔(xml為例) , 放置於 assets , 使用 AssetManager 讀取 , 輸出到 TextView

        TextView info_message = (TextView)findViewById(R.id.info_message);
AssetManager assetManager = getAssets();
    InputStream inputStream = null;
 
    String MyStream;
    try {
        // 指定/assets/MyAssets.txt
        inputStream = assetManager.open("trappoint.xml");
   
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] bytes = new byte[4096];
   
        int len;
        while ((len = inputStream.read(bytes)) > 0){
         byteArrayOutputStream.write(bytes, 0, len);
        }
   
        MyStream = new String(byteArrayOutputStream.toByteArray(), "UTF8");
       
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        MyStream = e.toString();
    }
 
    info_message.setText(MyStream);


使用  AssetManager , 將放置於 assets(資源管理匣) 的 trappoint.xml(各種檔案)
在此以 純文字檔 xml 為例
讀取 , 顯示於 名為 R.id.info_message 的 TextView



TextView 輸出結果


2013年5月2日 星期四

UIBarButton init 使用 SystemItem 以及 WithTitle

UIBarButton

兩種 alloc & init 的方法


第一種 , 使用 SystemItem
     UIBarButtonItem *saveButton = [[UIBarButtonItem alloc]
                                    initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                   target:self
                                   action:@selector(deleteAction:)];
    saveButton.style = UIBarButtonItemStyleBordered;




第二種 , 使用自定義文字
    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithTitle:@"Recent" style:UIBarButtonItemStyleBordered target:self action:@selector(deleteAction)];
    saveButton.tag = 1;