Android OS バージョンのコードネームを取得する

端末のOSのバージョンをみる.


Log.d(TAG, "RELEASE : " + Build.VERSION.RELEASE);
Log.d(TAG, "SDK     : " + Build.VERSION.SDK_INT);


RELEASE : 4.3.1
SDK     : 18

「API-18」て「Gingerbread」だったけか?

などといつもググっているが.

Dashboards___Android_Developers

Dashboards | Android Developers

いい暗記方法ねえかなと思いつつコードで吐く.


for (Field field : Build.VERSION_CODES.class.getDeclaredFields()) {
  field.setAccessible(true);
  Log.d(TAG, field.get(this) + " -> " + field.getName());
}


1 -> BASE
2 -> BASE_1_1
3 -> CUPCAKE
10000 -> CUR_DEVELOPMENT
4 -> DONUT
5 -> ECLAIR
6 -> ECLAIR_0_1
7 -> ECLAIR_MR1
8 -> FROYO
9 -> GINGERBREAD
10 -> GINGERBREAD_MR1
11 -> HONEYCOMB
12 -> HONEYCOMB_MR1
13 -> HONEYCOMB_MR2
14 -> ICE_CREAM_SANDWICH
15 -> ICE_CREAM_SANDWICH_MR1
16 -> JELLY_BEAN
17 -> JELLY_BEAN_MR1
18 -> JELLY_BEAN_MR2

他の端末で.


RELEASE : 5.1.1
SDK     : 22

1 ->BASE
2 -> BASE_1_1
3 -> CUPCAKE
10000 -> CUR_DEVELOPMENT
4 -> DONUT
5 -> ECLAIR
6 -> ECLAIR_0_1
7 -> ECLAIR_MR1
8 -> FROYO
9 -> GINGERBREAD
10 -> GINGERBREAD_MR1
11 -> HONEYCOMB
12 -> HONEYCOMB_MR1
13 -> HONEYCOMB_MR2
14 -> ICE_CREAM_SANDWICH
15 -> ICE_CREAM_SANDWICH_MR1
16 -> JELLY_BEAN
17 -> JELLY_BEAN_MR1
18 -> JELLY_BEAN_MR2
19 -> KITKAT
20 -> KITKAT_WATCH
21 -> L
21 -> LOLLIPOP
22 -> LOLLIPOP_MR1

その端末が知っているOSコードネーム群の最終がその端末のOSコードネームと想像.


Field[] fields = Build.VERSION_CODES.class.getDeclaredFields();
Log.d(TAG, "Name : " + fields[fields.length - 1].getName());


Name : LOLLIPOP_MR1

最終でないことはあり得るのか.

フツーに走査か.

Cross Reference: Build.java

追記:2020-03-13

Kotlin で。

追記:2022-01-26


【2015-10-14 公開!!】Google I/O 2015 のソースコードに見るディレクトリ構成

d2f9b090-727a-11e5-96aa-b92347fe83f2

半年くらい遅れていましたが公開されている.

Oct 14, 2015, 5:41 PM GMT+9
Initial source posted. We'll be iterating on it a bit going forward. As always we welcome contributions.

PaulRashidi

I/O 2015 Source Code · Issue #139 · google/iosched

google_iosched

google/iosched

Androidアプリコード部分の基本的なディレクトリ/ファイル (モジュール/クラス) の構成をみる.

iosched/android/src/main/java/com/google/samples/apps/iosched/

機能別 (供用)

AppApplication.java
Config.java

provider/*Contract.java
provider/*Enum.java
provider/*Provider.java
provider/*Database.java (extends SQLOpenHelper)

receiver/*Receiver.java
service/*Service.java
util/*Utils.java

io/model/*.java
io/*Handler.java (extends JSONHandler)
io/JSONHandler.java

ui/BaseActivity.java

画面別

*/*Constants.java

*/*Activity.java
*/*Fragment.java
*/*View.java

*/*Adapter.java

*/*Helper.java
*/*Utils.java

*/data/*Data.java
*/*Model.java (interface)

直感的に分かりやすく整理されています.

ソースディレクトリの構成時にもっておくべき「会社別」のイメージ


今ではToolbar記述は不要となっていました とさ

昔々, こんな記述がありました.

...
dependencies {
    compile "com.android.support:appcompat-v7:21.0.+"
}
...
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blah);

    Toolbar toolbar = (Toolbar) findViewById(R.id.myawesometoolbar);
    setSupportActionBar(toolbar);
}
...
...
<android.support.v7.widget.Toolbar
    android:id=”@+id/my_awesome_toolbar”
    android:layout_height=”wrap_content”
    android:layout_width=”match_parent”
    android:minHeight=”?attr/actionBarSize”
    android:background=”?attr/colorPrimary” />
...

AppCompat v21 — Lollipop 搭載前のデバイスにマテリアル デザインを! - Google Developer Japan Blog

旧ActionBarを隠したりとか, そんなテーマのとか, メニューのとか, 面倒でしたが今ではもうこの記述不要なのですね.

以下, Android Studio で BlankActivity をGUIから作成. API23.

...
dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.0.1'
}
...
...
public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
}
...
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
...
>
    <TextView
        android:text="Hello World!"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</RelativeLayout>

KITKATでもLOLLIPOPでもきちんと表示されます.
Android_Device_Monitor 2

Android_Device_Monitor

テーマは, 非NoActionBarを親にして色を設定.

...
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>
...

前の記述のままでも動いてしまうのですが, 消したほうが気持ちがよいです.

元々,「appcompat-v7」の「v7」というのは,「API7まで対応できる」という後方互換の意味でしたよね.