顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2015年2月25日 星期三

[Android] 整理筆記:有關Android裝置的定位

以使用者的角度來說明,會接觸到的定位總共有三種方式
我直接整理成表格,幫助大家快速理解


GPS及Wi-Fi定位並沒有哪個較好,而是在不同的狀況要使用不同的種類
這兩種也能夠相輔相成搭配著使用
​依照不同情境,可在在Android裝置中設定,「設定」->「定位」

1. 高精確度:使用GPS、Wi-Fi和行動網路判斷位置
    >> 需要精確定位可用此,例如導航
2. 節約耗電量:使用Wi-Fi和行動網路判斷位置
    >> 較GPS省電,但Wi-Fi要一直開啟(註1)平常在都市生活可用此就好
3. 僅限裝置:使用GPS判斷您的位置
    >> 不需網路即可定位,但耗電,到山上野外或海邊想看地圖的時候用此



================================================================================

*註1
Android_4.3增加了「為了使定位精準,即使Wi-Fi功能關閉,Google和其他應用程式可能會掃描附近的Wi-Fi網路」

意思是
在以前要用Wi-Fi定位時,必須要一直將Wi-Fi開啟,但現在關閉Wi-Fi後,仍然可以使用Wi-Fi定位
換句話說,即使將Wi-Fi關閉,不代表真正將Wi-Fi關閉,Wi-Fi仍會在背景運作輔助定位

若要真正將Wi-Fi關閉,則到「Wi-Fi」->「進階」->「一律執行掃描」,取消勾選

 







※整理筆記於

2015年2月22日 星期日

[Android][AndroidStudio] 修改自動排版(Reformat code)的規則

滿久沒有更新了
因為工作忙案子趕,即使覺得有不錯的東西或是需要記憶的東西
但沒有時間紀錄在blog

最近改到Android Studio開發,簡直不只是崩潰可以形容
雖然可以將快捷鍵改為原本Eclipse使用的
不過既然都已經換了,所以快捷鍵還是重新背Android Studi版的吧!

--

在Android Studio中要自動排版的快捷鍵是

  • (Win) CTRL + ALT + L
  • (Mac) OPTION + CMD + L

若要修改排版的規則則在
Preference->Code Style

附圖為,我修改了Java的空行部分
原有最大行數為2行,因為習慣的原因改為1行



2014年8月17日 星期日

[Android] 在調整ImageView寬高時保持原比例

今天遇到一個需求
圖片width需與parent相同,height要以等比例放大
於是先將ImageView設定成

<ImageView
    android:id="@+id/picture"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drwable/pic" >
</ImageView>

但發現他設的height是原圖的height
在width拉到與parent相同時,height並不會跟著改變
因此要在程式中設定

ImageView img = (ImageView) findViewById(R.id.picture);
img.setAdjustViewBounds(true);

這樣height才會動態的調整成,已拉成與parent相同width比例對應的height

2014年8月11日 星期一

[Android] 從keystore取得hash key

用Facebook等SDK
有時需要上傳自己的hash key作為debug用

在Eclispe->Preference->Android->Build可以看到自己的default debug keystore路徑
可使用keytool及openssl從debug keystore取得hash key

$ keytool -exportcert -alias androiddebugkey -keystore [debug.keystore] | openssl sha1 -binary | openssl base64


2014年6月20日 星期五

[Android] 開啟FB app的網址

用FB app開啟特定分頁的網址為

fb://profile/[id]

從普通網頁可尋找到FB專頁的id
若已經改成特殊帳號
可經由此網頁搜尋id
https://graph.facebook.com/[帳號]
在網頁中可尋找到此FB分頁的id


refs:http://im88.tw/?p=18981

--

150527_note:

fb://page/[id]
fb://profile/[id]

[Android] page顯示的包含粉絲團簡要說明、按贊數、置頂文、普通文章,profile顯示的僅有普通文章。
[iOS] page.不吃此網址,profile顯示的包含粉絲團簡要說明、按贊數、置頂文

2013年11月1日 星期五

[Android][Example] 用SoundPool控制左右聲道

如果需要控制左右聲道的音量,SoundPool有提供這個功能
SoundPool的優點是可以同時撥好幾個音檔
但卻對音檔的大小有限制
因此只適合撥較短的音檔

以下範例UI會有左右聲道的播放及停止按鈕





activity_main.xml


    

        

        

    

        

        



MainActivity.java
package com.qn.leftrightsound;

import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
    private String TAG = "leftrightsound";
    private SoundPool soundPool;
    private Button button_left_play, button_left_pause, button_right_play, button_right_pause;
    private int music_left, music_right;
    private int music_left_temp, music_right_temp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        music_left = soundPool.load(this, R.raw.left_sound, 1);
        music_right = soundPool.load(this, R.raw.right_sound, 1);
        // 音樂檔案放在res/raw底下,預設沒有raw資料夾,要自己建

        button_left_play = (Button) findViewById(R.id.button_left_play);
        button_left_pause = (Button) findViewById(R.id.button_left_pause);
        button_right_play = (Button) findViewById(R.id.button_right_play);
        button_right_pause = (Button) findViewById(R.id.button_right_pause);

        button_left_play.setOnClickListener(ButtonListner);
        button_left_pause.setOnClickListener(ButtonListner);
        button_right_play.setOnClickListener(ButtonListner);
        button_right_pause.setOnClickListener(ButtonListner);
    }

    private Button.OnClickListener ButtonListner = new Button.OnClickListener() {

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.button_left_play:
                Log.i(TAG, "press left play");
                music_left_temp = soundPool.play(music_left, 1, 1, 0, 0, 1);
                // 由於每次播放的id會不同,為考慮到按下暫停是要暫停剛剛播放的,因此將每次播放的id存起來
                // play()
                // 第一參數為音檔id
                // 第二.三參數為左右聲道的音量,range = 0.0 to 1.0
                // 第四參數為優先權,若不需設定可都設為0,0為最小優先權
                // 第五參數為loop,0 = no loop, -1 = loop forever
                // 第六參數為速度,1.0 = normal playback, range 0.5 to 2.0
                break;
            case R.id.button_left_pause:
                Log.i(TAG, "press left pause");
                soundPool.stop(music_left_temp);
                 break;
            case R.id.button_right_play:
                Log.i(TAG, "press right play");
                music_right_temp = soundPool.play(music_right, 0, 1, 0, 0, 1);
                break;
            case R.id.button_right_pause:
                Log.i(TAG, "press right pause");
                soundPool.stop(music_right_temp);
                break;
            }
        }
    };

    @Override
    protected void onDestroy() {
        this.soundPool.release();
         super.onPause();
    }

}

2013年10月3日 星期四

[Android] 檢查apk sign的key

與sign key一樣使用java的指令 -- jarsigner

$ jarsigner -verify -verbose -certs [apk_name]

會列出來像是以下的資訊
sm      3512 Mon Apr 15 00:13:32 CST 2013 AndroidManifest.xml

      X.509, CN=Android Debug, O=Android, C=US
      [certificate is valid from 2013/4/14 下午 3:10 to 2043/4/7 下午 3:10]

sm      5937 Sun Apr 14 15:09:46 CST 2013 res/drawable-xhdpi/ic_launcher.png

      X.509, CN=Android Debug, O=Android, C=US
      [certificate is valid from 2013/4/14 下午 3:10 to 2043/4/7 下午 3:10]

如果用Android test key sign過的apk結果會長這樣
sm      3875 Wed Apr 16 07:40:50 CST 2008 res/drawable-hdpi/rbt_icon.png

      X.509, EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
      [certificate is valid from 2008/4/16 上午 6:40 to 2035/9/2 上午 6:40]

sm      1765 Wed Apr 16 07:40:50 CST 2008 res/drawable-ldpi/rbt_icon.png

      X.509, EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
      [certificate is valid from 2008/4/16 上午 6:40 to 2035/9/2 上午 6:40]

可以藉此得知apk是用哪一把key sign的

refs:http://www.cnblogs.com/not-code/archive/2011/05/15/2047057.html

2013年9月23日 星期一

2013年7月18日 星期四

[Linux][Android] 在Ubuntu12.04建置build code環境

OS: Ubuntu_12.04_64bit

1. 安裝build code環境
 $ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
 $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

2. gcc 4.4.X
由於新版的gcc會影響build code error,須降版成4.4.X
(code不夠嚴謹,跟不上gcc4.6)
 1). 安裝
  $ sudo apt-get install gcc-4.4 g++-4.4 gcc-4.4-multilib g++-4.4-multilib
 2). 設定gcc及g++的參數
  $ sudo update-alternatives --install \
    /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 \
    --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
  $ sudo update-alternatives --install \
    /usr/bin/gcc gcc /usr/bin/gcc-4.4 40 \
    --slave /usr/bin/g++ g++ /usr/bin/g++-4.4
 3). 選擇gcc-4.4
  $ sudo update-alternatives --config gcc

3. JDK
Ubuntu12.04預設是open jdk,需指定成sun jdk
可參考:http://qnworknote.blogspot.tw/2012/09/linux-java.html
由於android makefile只支援到1.6.X,建議用1.6.X版本
 1). 到官網下載6u45
  http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jdk-6u45-oth-JPR
 2). $ chmod u+x jdk-6u45-linux-x64.bin
  $ sudo ./jdk-6u45-linux-x64.bin
  $ sudo mkdir /usr/lib/jvm
  $ sudo cp -rf jdk1.6.0_45 /usr/lib/jvm/
  $ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.6.0_45/bin/java" 1
  $ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.6.0_45/bin/javac" 1
  $ sudo update-alternatives --install "/usr/lib/mozilla/plugins/libjavaplugin.so" "mozilla-javaplugin.so" "/usr/lib/jvm/jdk1.6.0_45/jre/lib/amd64/libnpjp2.so" 1
 3). 檢查各項目的優先順序是否正確

//====================================================

※額外補充:

1. 新增repo的環境變數
 1). 下載repo (也可以直接從網址下載)
  $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > .
 2). repo設為可執行
  $ chmod a+x repo
 3). 設為環境變數
  $ cp repo /usr/bin

2. 新增adb的環境變數
 1). 下載adt bundle,並取得adb
  從Android Developer下載adb bundle:http://developer.android.com/sdk/index.html
  adb位置:adt-bundle-linux-x86_64-20130219/sdk/platform-tools/adb
 2). 設為環境變數
  $ cd [PATH]/adt-bundle-linux-x86_64-20130219/sdk/platform-tools/
  $ cp adb /usr/bin

2013年4月8日 星期一

[Android] 分析This Handler class should be static or leaks

好文章,留著筆記:http://www.beyondcompare.cn/this-handler-class-should-be-static-or-leaks.html

重點擷取以下:

Handler作为Activity的内部类有可能会导致内存泄露的问题。
Handler类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的引用。如果Handler是个内部类,那么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

package cn.beyondcompare.statichandlerdemo;

import java.lang.ref.WeakReference;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;

public class MainActivity extends Activity {

 MyHandler handler = new MyHandler(this);

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  test();
 }

 static class MyHandler extends Handler {

  WeakReference mActivity;

  MyHandler(MainActivity activity) {
   mActivity = new WeakReference(activity);
  }

  @Override
  public void handleMessage(Message msg) {
   MainActivity theActivity = (MainActivity) mActivity.get();
   switch (msg.what) {
   case 0:
    theActivity.test1();
    break;
   }
  }
 };

 private void test() {
  handler.sendEmptyMessage(0);
 }

 private void test1() {
 }
}

2013年3月20日 星期三

[Android] 使用需系統權限的APP的方法

需要系統權限的APP預設安裝進去device
是無法取得系統權限的
需取得系統權限有兩種方法

1. sign與image相同的platform key
$ java -Xmx2048m -jar linux-x86/framework/signapk.jar -w keys/platform.x509.pem keys/platform.pk8 [unsigned_app] [signed_app]

2. 將app push到/system/app底下,APP即可取得系統權限
$ adb root
$ adb remount
$ adb push [app_name] /system/app




ref1:[Android] 查看Android device key:app sign key

ref2:[Android] 修改system權限

--

2014/2/7 note

key在codebase的build/target/product/security中

[Android] 修改system權限

/system的權限預設都為read only
若要修改權限,直接下chmod是無法改變權限的
需透過adb remount,將/system權限改為read. write

$ adb root
$ adb remount

=>補充:adb remount為重新將系統掛載為R/W模式

2013年2月27日 星期三

[Android] 調整APP螢幕亮度

以下調整當下activity亮度
與系統的亮度沒有關聯

若要調整系統亮度的寫法
因需要系統權限,app需sign key
則會另開一篇文章分享

//=====================================

螢幕亮度的值為0-255

import android.view.WindowManager;

private void setBrightnessLevel(final int brightness_level) {
 WindowManager.LayoutParams lp = getWindow().getAttributes();
 lp.screenBrightness = Float.valueOf((brightness_level) * (1f / 255f));
 getWindow().setAttributes(lp);
}


[Android] string及R.String在textview的轉換

在Android中,字串可宣告在程式之中
也可宣告在strings.xml成為resource使用

以下範例列出
在使用textview.setText()中,要使用這些字串的方式
並列出若是使用html的效果的方式

分別兩者之中宣告變數
[程式]
private String hello = "Hello World";
private String hello_html = "<b>Hello World</b>";

[String.xml]
<string name="bye">Bye Bye</string>
<string name="bye_html">
<![CDATA[
<b>Bye Bye</b>
 ]]>
</string>

textview1.setText(hello);
textview2.setText(Html.fromHtml(hello_html));

textview3.setText(R.string.bye)
textview4.setText(Html.fromHtml(getString(R.string.bye_html)));



[Android] 讓textview顯示html效果

讓textview顯示html的效果,只要在setText內多加Html.fromHtml()

要使用的html效果可加在宣告string的內容中
也可直接加在Html.fromHtml()之中

private String status_result = "Please press PASS/FAIL button.";

textview_status1.setText(Html.fromHtml(status_result));

textview_status2.setText(Html.fromHtml("Please press PASS/FAIL button."));

textview_status3.setText(Html.fromHtml(getString(R.string.status_result)));

[Android] xml檔註記html的方式

若在strings.xml中,所宣告的string需包含html的格式
前後需夾註
<![CDATA[
]]>

  <![CDATA[
        Please press PASS/FAIL button.
        ]]>

2013年2月18日 星期一

[Android] 強制開啟APP的方法


強制開啟APP的方法
$ adb shell am start -a android.intent.action.MAIN -n [Package_Name]/.[Activity_Name]

ex: adb shell am start -a android.intent.action.MAIN -n com.example.brightnesstest/.BrightnessTest

2013年1月29日 星期二

[Android] [Format] Android支援的圖片格式

Android支援的圖片格式

Type
Format / Codec
Encoder
Decoder
Details
Supported File Type(s) / Container Formats
Image
JPEG
Base+progressive
JPEG (.jpg)
GIF


GIF (.gif)
PNG

PNG (.png)
BMP


BMP (.bmp)
WEBP

(Android 4.0+)

(Android 4.0+)

WebP (.webp)



refs:http://developer.android.com/guide/appendix/media-formats.html

[Android] View Bitmap Canvas與Drawable

refs:http://chihweiwu.blogspot.tw/2012/11/android-view-bitmap-canvasdrawable.html
refs:http://givemepass.blogspot.tw/2012/03/drawablecanvas-and-view.html