跳到主要內容

發表文章

目前顯示的是有「android」標籤的文章

AndroidManifest的小技巧

當在設定推播時,在  AndroidManifest.xml  上需要指定不同application id時該怎麼辦呢?(可能會有xxx.yyy.com.debug與xxx.yyy.com兩個版本) 有個簡單的小技巧可以實現這件事情。 <permission android:name= "${applicationId}.permission.C2D_MESSAGE" android:protectionLevel= "signature" /> <uses-permission android:name= "${applicationId}.permission.C2D_MESSAGE" /> 參考資料: Using build types in Gradle to run same app that uses ContentProvider on one device

Android 6.0 權限問題

因為總總原因,直到現在才重視這個問題 首先根據 官方文件所述 : 在Android 6.0 (API level 23) 之後分成兩種權限 一般權限(Normal permissions) 危險權限(Dangerous permissions) 列出危險權限的列表 Permission Group Permissions CALENDAR READ_CALENDAR WRITE_CALENDAR CAMERA CAMERA CONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS LOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION MICROPHONE RECORD_AUDIO PHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS SENSORS BODY_SENSORS SMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE 不論一般權限與危險權限,都一樣必須在 AndroidManifest.xml 中使用 <uses-permission> 宣告 而最大的差異在於 危險權限必須另外執行請求權限的訊息框 。 附上在 Activity 實做的儲存權限範例: ... public final static int PERMISSION_CODE = 1 ; protected boolean isStoragePermissionGranted () { if (Build. VERSION . SDK_INT >= 23 ) { String permission = android. Man...

Android 檢查GPS

首先要記得有取得GPS的權限 <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" /> 才能檢查GPS有無開啟的狀態 public boolean isGPSEnables () { LocationManager locationManager = (LocationManager) getSystemService(Context. LOCATION_SERVICE ); return locationManager. isProviderEnabled (LocationManager. GPS_PROVIDER ); } 純粹紀錄一下檢查GPS有無開啟的程式碼~

Java Semaphore 用途

老實說,這是第一次接觸到 Semaphore 之前也從來沒使用過,但當使用到他的時候才發現 在多執行緒時的控制,如果想要在某個情況下一次只執行一個執行緒(其實就是想做Lock動作) Semaphore 可以省下許多事情啊!以下列出簡單的範例code protected Semaphore isLock = new Semaphore( 1 ); // 限制同時只有1個在執行 ... new Thread ( new Runnable() { @Override public void run () { try { for ( int i = 0 ; i < 5 ; i++) { isLock. acquire (); // 會先印出open run1接著要等isLock.release(),才會再繼續印出 open run2 Log. e ( "Test" , "open run" + i); } } catch (Exception ex) { isLock. release (); } } }). start (); ... Button release = (Button)findViewById(R. id . release ); release. setOnClickListener ( new View. OnClickListener () { @Override public void onClick (View v) { isLock. release (); // 按下按鈕後才會繼續執行 } }); 參考資料: Semaphore

Android 呼叫 zxing QR code scanner

今天弄個簡單的範例是關於執行QR code掃描的部分 這個方法是直接呼叫 Barcode scanner 的方法 首先在 build.gradle 的 dependencies 加上 compile 'com.google.zxing:android-integration:3.2.1' dependencies { ... compile 'com.google.zxing:android-integration:3.2.1' } 呼叫的方式則是在 Activity or Fragment 中加入執行的程式 IntentIntegrator scanner = new IntentIntegrator(mActivity); scanner. initiateScan (); 要如何得到掃描的值呢?只要 override onActivityResult 就可以囉! @Override protected void onActivityResult ( int requestCode, int resultCode, Intent data) { super . onActivityResult (requestCode, resultCode, data); IntentResult scanner = IntentIntegrator. parseActivityResult (requestCode, resultCode, data); if (scanner != null ) { String code = scanner. getContents (); // 掃描得到的字串 String format = scanner. getFormatName (); // 掃描的格式, 如 QR_CODE } } 附上參考的 java doc Class IntentIntegrator Class IntentResult

Android開啟Facebook App

如果手機裡已經安裝了Facebook,為什麼還要開啟瀏覽器重新輸入帳密呢? 直接用Facebook操作不是比較方便呢? --以上是前言--XD 所以為了方便已經安裝Facebook使用者,所以App裡開啟粉絲專頁時,應該會有兩種方式 範例如下: ... public static void openFacebookPage (Context context, String id) { Intent intent = null ; try { context. getPackageManager (). getPackageInfo ( "com.facebook.katana" , 0 ); String uri = "fb://page/" + id; intent = new Intent(Intent. ACTION_VIEW , Uri. parse (uri)); } catch (Exception e) { String uri = "https://www.facebook.com/pages/1/" + id; intent = new Intent(Intent. ACTION_VIEW , Uri. parse (uri)); } context. startActivity (intent); } ... 參考資料: android - launch facebook app from other app - Stack Overflow php - Facebook API - How do I get a Facebook user's profile image through the Facebook API (without requiring the user to "Allow" the applicati...

Android webview 平板瀏覽手機頁面

在使用平板瀏覽網頁時,卻發現顯示一般的網頁資訊,偏偏想要的結果是瀏覽手機版網頁。 所以這時候就得設定 User Agent(這個前提是網頁切換方式是判斷User Agent) 參考設定的內容如下 ... WebView webView = (WebView) findViewById(R. id . web ); ... webView. getSettings (). setUserAgentString ( "Mozilla/5.0 (Linux; Android 4.4.4; en-us; Nexus 4 Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2307.2 Mobile Safari/537.36" ); ... 目前用平板瀏覽,確實是手機版網頁,不過這前提是網頁偵測方式是用User Agent判斷 如果是採用螢幕寬度來判斷的話 ... 目前沒想法了(攤)

Android 系統字體大小辨識

如果使用者想要調整字體大小,那要如何取得調整的比例呢? (如何調整大小:設定〉無障礙設定〉字體(或是大字體,每間廠商會有些許不同)) 會了確保字體被放大時,版面不影響,這時候需要做相對應的調整 取得使用者目前的字體比例如下 float scale = getResources(). getConfiguration (). fontScale 這時候再依照需求去調整,一般預設大小值會等於 1 其他值就得視各家廠商了~

Android startActivity跟startActivityForResult

當想要切換Activity時,可以用兩個方式,startActivity與startActivityForResult 而這兩個又有什麼分別呢? 假設目前執行是A activity,startActivity就是單純傳資料給B activity並啟動,而startActivityForResult則是多了一件事情,就是當B activity結束時,可以回傳狀態給A activity。 簡單的範例startActivity:AActivity ... String test = "TEST" ; Intent intent = new Intent(context, BActivity. class ); intent. putExtra (BActivity. TEST_PARAM , test); startActivity(intent); ... 簡單的範例startActivityForResult:AActivity public static final int REQUEST_CODE = 0 ; ... String test = "TEST" ; Intent intent = new Intent(context, BActivity. class ); intent. putExtra (BActivity. TEST_PARAM , test); startActivityForResult(intent, REQUEST_CODE); ... 我們現在完成了開啟與傳資料的動作,當我們使用startActivityForResult,我們必須在BActivity增加setResult且AActivity增加onActivityResult功能才行。 class BActivity ... ... // 沒有回傳資料的方式 setResult(RESULT_OK) // 回傳資料的方式 String back = "Back Test" ; Intent intent = new Intent(); intent. putExtra (BA...

EditText android:imeOptions 用法

在XML標籤裡,使用android:imeOptions的用處是什麼呢? <...> <EditText android:id= "@+id/name" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:padding= "8dp" android:gravity= "top" android:hint= "@string/name" android:inputType= "text" android:imeOptions= "actionNext" android:textSize= "18sp" /> <EditText android:id= "@+id/email" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:padding= "8dp" android:gravity= "top" android:hint= "@string/email" android:inputType= "text" android:imeOptions= "actionSearch" android:textSize= "18sp" /> <...> 以上面的範例,則是輸入id/name的EditTe...

Android 如何在 Fragment 執行 onCreateOptionsMenu

Activity執行 Fragment預設並不會執行onCreateOptionsMenu,因此為了讓每個Fragment都有不同的OptionsMenu時,就得要執行setHasOptionsMenu(true); 簡易範例如下 ... @Override public void onActivityCreated (Bundle savedInstanceState) { super . onActivityCreated (savedInstanceState); setHasOptionsMenu( true ); } @Override public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) { inflater. inflate (R. menu . menu_place , menu); super . onCreateOptionsMenu (menu, inflater); } ... 這樣就可以執行到onCreateOptionsMenu的功能了

Android 自訂 Google Map Info Window

參照 Google Maps Android API v2 文件 以下是一個簡單的範例程式 import ... public class MyMapFragment extends SupportMapFragment { public static MyMapFragment newInstance () { return new MyMapFragment (); } public MyMapFragment () { } @Override public void onCreate (Bundle savedInstanceState) { super . onCreate (savedInstanceState); getMapAsync(onMapReadyCallback); } private OnMapReadyCallback onMapReadyCallback = new OnMapReadyCallback() { @Override public void onMapReady (GoogleMap googleMap) { double la = 25.033718 ; double lo = 121.56481 ; String title = "臺北101" ; // 設定資料 MarkerOptions options = new MarkerOptions(). position ( new LatLng(la, lo)); options. title (title) . icon (BitmapDescriptorFactory. defaultMarker (BitmapDescriptorFactory. HUE_AZ...

Android 取得版本資訊

使用 PackageInfo 取得版本資訊 PackageInfo pInfo = null ; try { pInfo = getPackageManager (). getPackageInfo ( getPackageName (), 0 ); } catch ( Exception ex ) { } int versionCode = pInfo . versionCode ; String versionName = pInfo . versionName ; 如果有掛載 Gradle plugin 或是 使用 Android Studio 0.7.0 以上,就可以用 BuildConfig 取得版本資訊 int versionCode = BuildConfig . VERSION_CODE ; String versionName = BuildConfig . VERSION_NAME ;

在Mac上使用Ionic進行Android開發

首先要安裝Ionic npm install -g cordova ionic  註 npm:是Node Package Manager 註 cordova:是PhoneGap,在1.4版本以後都改名為cordova 接著安裝Android SDK(不過本人偷懶,直接安裝 Android Studio ) 安裝完後,就在個人資料夾更新 ~/.bash_profile 檔案 export ANDROID_HOME=/Applications/Android\ Studio.app/sdk ANDROID_TOOLS=$ANDROID_HOME/tools/:$ANDROID_HOME/platform-tools export PATH=$ANDROID_TOOLS:$PATH 接著安裝 Apache Ant brew install ant 好了,環境完成接下來就來產生專案 ionic start myApp blank 產生myApp這個專案,先進到此目錄,然後新增android平台 cd myApp ionic platform add android 接著編譯它 ionic build android 畫面上就會出現apk的位置 大功告成 :D 來源資料: Getting Started with Ionic Getting up and running with Ionic for Android development on OSX