Android プログラミングの覚え書き

最終更新  2024.04.01


◆◆ Android studio のインストール (Windows7) 2015.8.31 ◆◆


この例は、デフォルトではないドライブにインストールするときの
覚え書きである。

http://thinkit.co.jp/story/2015/02/26/5646/page/0/1
http://thinkit.co.jp/story/2015/02/26/5646/page/0/2

に書いてある通りに行う。

1. Oracle のサイトに行って JDK 8 Update 60 (64bit) をインストールする。

インストール先は d ドライブに変更する。

d:\Program Files\Java\jdk1.8.0_60
d:\Program Files\Java\jre1.8.0_60

2. Android Studio のインストール

インストール先は以下のように変更する。

android studio: d:\Program Files\Android\Android Studio (500MB)
android SDK:    d:\(user-home)\AppData\Local\Android\sdk   (3.2GB)

インストールの途中で、以下のエラーダイアログが表示される。

Failed to install Intel HAXM. For details, please check the
instllation log: "C:\(user-home)\AppData\Local\Temp\nso4191.tmp\haxm_silent_run.log"

この結果として、エミュレータが動かない。対処法は後で示す。

3. Android Studio の起動

1 回目の起動はものすごく時間がかかる(5 分以上)
待ちきれずに、「動かない」と思わないように。


◆◆ Android studio が起動しない ◆◆


環境変数 JAVA_HOME を設定する。

C:\Program Files\Java\jdk1.x.y_zz

コマンドプロンプトで

> echo %JAVA_HOME%

で確認できる。


◆◆ Android studio のエミュレータが動かない問題への対処法 2015.9.9 ◆◆


2 つ原因がある。

1. Intel のハードウェアアクセラレータが on になっていない。
2. エミュレータがインストールされていない。

1. は bios の設定変更が必要。

起動時に del キーを押すと、bios 設定モードに入る。
マウス操作可能。

(職場のパソコン)
右上の advanced 設定モード -- Advanced -- CPU configuration --
intel virualization → enabled

(自宅のパソコン)
advanced settings -- cpu settings -- intel visualization technology → enabled

f10 で抜ける

2. は以下の手順が必要。

file -- settings -- appearance & behavior -- system settings -- android sdk ---
SDK Tools -- 下から 2 番目の Intel x86 emulator accelerator
で「インストーラ」をインストールする。

次に、その「インストーラ」を起動して「エミュレータ」をインストールする。
インストーラの位置は以下の通り。

(ユーザーフォルダ)\AppData\Local\Android\sdk\extras\intel
\Hardware_Accelerated_Execution_Manager\intelhaxm-android.exe

◆◆ Android studio エディタ環境のカスタマイズ 2017.8.21 ◆◆


File -- Settings -- Editor -- Colors & Fonts

まず scheme   save as をクリックする。そうでないと、
変更できない。

フォント:Font   16pt

色:
use interited attributes にチェックが入っている色は、
先祖の設定を受け継ぐ。

General -- Text -- Default Text をまず設定する。

次に Language Defaults を設定する。

次に Java を設定する。

コード例が表示されている領域でクリックすると、
その部分に該当する部分の色を設定することができる。

プロジェクトビュー、などの色は、Apply を押しても変わらない。
一旦 Android Studio を終了し、再度起動すると、変更されている (2015)。


◆◆ エミュレータの操作法 2015.8.31 ◆◆


・起動直後の操作

エミュレートする機種によっては、起動直後にまず、
鍵を外す動作をせねばならない。そうしないと、
いつまで待っても画面が進まない。

・画面サイズの変更

Run --> Edit Configulations --> Android Application --> App

General:
  Target Device を Emulator にして何か選ぶ

Emulator:
  Additional command line options に -scale 0.8

・画面がウィンドウの外にはみ出してしまったとき

クリック --- alt + space --- M --- カーソル移動キー


◆◆ (user-home) 以下のファイルの移動 2015.8.31 ◆◆


C:\users\(user-name) の下に

(1) .android              1.5G
(2) .AndroidStudio1.3     500MB   エディタの色設定情報はここにある
(3) .gradle                20MB
(4) AndroidStudioProjects  40MB

というフォルダが作成され、ディスクを圧迫している。移動する。

(4) AndroidStudioProjects

ユーザーが作るプログラムが入るフォルダである。
新規作成時に指定するフォルダを変更すればよい。

(2) .AndroidStudio1.3

(参考)
http://www.laurivan.com/android-studio-change-the-location-of-androidstudiobeta/

D:\Program Files\Android\Android Studio\bin\idea.properties

を書き換える。

idea.config.path=d:\(user-home)/.AndroidStudio1.3/config
idea.system.path=d:\(user-home)/.AndroidStudio1.3/system

(1)(2) .android  .gradle

(参考)

http://stackoverflow.com/questions/2841766/possible-to-change-where-android-virtual-devices-are-saved  シンボリックリンクを貼れば良いと書いてある
http://qiita.com/opengl-8080/items/c2b6a93dfca5b61f9e6a  シンボリックリンクの作成法
http://answers.microsoft.com/ja-jp/windows/forum/windows_7-windows_programs/windows-7/efef116a-2ea7-43f5-ac06-f553737870fa?auth=1  管理者権限で cmd を実行する方法

Windows にはハードリンク、シンボリックリンクの機能がある
(今日、知った。Vista 以降に追加されたそうだ)。
シンボリックリンクはエクスプローラで見ると、ショートカットと同一に見えるが、
コマンドプロンプトで dir コマンドを実行すると、異なる。

スタートメニューで cmd と打って ctrl + shift + enter を押すと
管理者権限で cmd を実行する。

> d:
> cd \(user-home)
> mklink /d .android d:\(user-home).android
> mklink /d .gradle  d:\(user-home)\.gradle

でシンボリックリンクを作成する。

後から振り返ると (1)〜(4) の全てが、この方法で解決可能であった。
(4) についてもシンボリックリンクを作成した。AppData もこの方法で
移動できると思われる。

別の方法として、環境変数を以下のように設定する方法でもいけるようだ。

set ANDROID_AVD_HOME=d:\(user-home)\.android\avd
set GRADLE_USER_HOME=d:\(user-home)\.gradle

◆◆ Android Studio における資源の場所 ◆◆


左端の Project をクリックすると、ツリー構造が見える。

ソースコード   app -- src -- main -- java -- com.example.yabu....
画面           app -- src -- main -- res -- layout -- activity_main.xml


◆◆ 実機での実行 2015.8.31 2016.4.19 ◆◆


・PC 側の操作

ドライバのインストールが必要。

Nexus, Xperia はドライバが自動でインストールされた。
Regza (T-01D) は富士通のサイトからドライバをダウンロードして
インストールする必要があった。
Huawei MediaPad M1 8.0 は google のサイトからドライバをダウンロードして
インストールする必要があった。

Huawei MediaPad M1 8.0 のドライバのインストール方法
  - google で Huawei MediaPad M1 8.0 driver で検索
  - http://mobileresources.biz/240-huawei-mediapad-m1-android-usb-driver-latest-version.html でドライバーがダウンロードできそうだが、ファイル PdaNetA4150.exe が見あたらない。
  - google で PdaNetA4150.exe を検索
  - 見つかったファイルをダウンロードして実行。

・実機側の操作

Xperia, Regza (Android 2.x)
  設定 → アプリケーション → 提供元不明のアプリ ○
  設定 → アプリケーション → 開発 → USB デバッグ  ○

Nexux, Huawei での操作 (Android 4.x)
  設定 -- 端末情報 -- ビルド番号を 7 回タップ
       -- 開発者向けオプション -- USB デバッグ

・Android Studio の操作

  Run --> Edit Configulations --> General: Target Device = USB

  エミュレータの設定をしていない状態で Huawei を使う場合、
  Tools --> Android --> Enable ADB Integration を on にする必要がある。

Run してから 8 秒くらいで実機での実行が始まる。
実機での終了は「戻る」ボタン。

実行できたということは、既にアプリはインストールされている。

・Android のバージョンの違いによるエラー

Xperia で実行しようとしたところ、

[INSTALL_FAILED_OLDER_SDK]

というエラーが出た。Android 4.4 で作ったアプリを Android 2.3.4 で実行
しようとしたためである。Android のバージョンは最初のプロジェクトを作る
場所で決まるので、2.3 用のアプリを新規作成すると、実行できた。


◆◆ 起動時の画面 ◆◆


「前回開いていたプロジェクトを開く」or「プロジェクトを選ぶ」
のどちらにするかは、以下の場所にある。

File --- Settings --- Appearance & Behavior --- System Settings
--- Startup/Shutdown --- reopen last project on startup


◆◆ アプリケーションの構造 (Add no Activity で作成) ◆◆


全てを 1 から書かなくてはならない。
また、レイアウトエディタは使えない。
次の 3 つが必要である。

(1) Activity クラスを継承したクラス MyActivity (名前はこれでなくてもよい)
    を作成する。

(2) View クラスを 1 つ作成し、メイン Activity の
    onCreate メソッドの中で setContentView(new MyView(this));
    のように呼ぶ。

(3) AndroidManifext.xml に以下の行を追加する。
    これを怠ると no default Main Activity というエラーが出る。
    activity タグの android:name=".xxxxx" の部分で main 関数に
    相当するクラスの名前を定義しているようだ。

  <application android:allowBackup="true"
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:theme="@style/AppTheme">
    /*------- ここから ------*/
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    /*------- ここまで ------*/
    </application>

1 文字でもスペルミスをすると no fefault main activity
というエラーが出る。例えば、

<category android:name="android.intend.category.LAUNCHER" />

となっていると (intend --> intent)、エラーが出て実行できない。

ボタンやエディットテキストなどのウィジェットを使うには、
自力で「配置、フォントサイズ設定」のコードを書かねばならない。

◆◆ アプリケーションの構造 (blank Activity で作成) ◆◆


Hello とだけ表示するノッペラボウのアプリが作成される。

アプリの構造は以下のようになっている。

ApplicationTest.java
  ApplicationTestCase<Application> クラスを継承して
  ApplicationText クラスを定義

MainActivity.java
  AppCompatActivity クラスを継承して
  MainActivity クラスを定義

AndroidManifest.xml より抜粋
  <activity
    android:name=".MainActivity"

ApplicationText クラスの役割については、よくわからない。


◆◆ Android Studio の画面構成 ◆◆


・プロジェクトのツリー構造

左端の「プロジェクト」をクリックすると、ツリー構造の
ウィンドウが現れる。

・レイアウトエディタ

activity_main.xml (app -- src -- main -- res -- layout)
をクリックすると、レイアウトエディタが起動する。
2 つのモードがある。

「左側にレイアウト  右側にプロパティリスト」
「左側に xml コード  右側にレイアウト」

左下の「Design」「Text」のタブで切り替える。

レイアウトが表示されないときは、右端の「Preview」をクリックする。


◆◆ ソケット通信 ◆◆


AndroidManifest.xml にネットワークのパーミッションを追加する。

   </application>

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

android 3.0 以降は UI からネットワーク通信は不可である。
スレッドを作成し、その中からソケット通信を行う。

------- サンプルプログラム ---------
        try{
            Socket s = new Socket(ip_address, iport_no);
            BufferedWriter w = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream()));

            w.write(send_str.toString());
            w.flush();   // これを忘れてはいけない

            recv_str = "";
            String buf;
            while(true){
                buf = r.readLine();
                if ( buf == null ) break;
                recv_str = recv_str + buf + "\n";
            }

            w.close();
            r.close();
            s.close();
----------------------------------------------------------

上の例で

  send_str = "1\n";

としたとき、1 の次は 0a が送られる。0d 0a ではない。


◆◆ Handler の使い方 ◆◆


ソケット通信を行うスレッドから MainAcitivity のウィジェットを
操作しようとするとエラーが発生する。Android では UI の操作を
スレッドから行うことは禁止されているらしい。

ハンドラーを使う必要がある。

メイン UI のコード

import android.os.Handler;

クラス変数宣言部
static Handler handler;
static TextView tv;

onCreate の中
handler = new Handler();
tv = (TextView) findViewById(R.id.textview);

スレッド内のコード

final String msg = "moji retsu";

MainActivity.handler.post(new Runnable() {
    public void run() {
        MainActivity.tv.append(msg);  // UI オブジェクトへの代入
    }
});


◆◆ Button, TextView のプロパティ ◆◆


背景色       background         foreground は設定しない
文字色       textColor
文字サイズ   textSize

(注意!)

button.setWidth(int)

が効かないことがある。これは、レイアウトエディタで不要な
設定が入っており、それがが優先される結果として生じる。

レイアウトエディタ上でドラッグすると、不要な設定が
書き込まれることがある。

   layout:alignStart
   layout:toEndOf
   layout:toStartOf

は不要なので、消す。

◆◆ TextView の使い方 ◆◆


import android.widget.TextView;

TextView tv;

tv = (TextView) findViewById(R.id.textview);

> 主なメソッド

tv.setText("aaa\n");
tv.append("abc"\n");
tv.setTextColor(Color.rgb(255,0,0));

> 内容の取得

String str = tv.getText().toString();

> エディットできるようにする

editable
enabled
focusable
focusableInTouchMode

> その他のメソッド

setTextSize(10.0f);   // dp

setLineSpacing(float add, float mult);   mult 倍され、さらに add が加算される。
setVerticalScrollerEnabled(true);


◆◆ Button の使い方 ◆◆


import android.widget.Button;
import android.view.View;

Button button1;

button1 = (Button) findViewById(R.id.button);
tv = (TextView) findViewById(R.id.textView);

button1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        tv.append("clicked!");
    }
});


◆◆ グローバル変数 ◆◆


main のクラスで static 宣言すると、

MainActivity.textview1 =

のようにグローバル変数のように扱える。

また、どこでも

  button1 = (Button) findVIewById(R.id.button);

とすると、オブジェクトへのポインタを取得できるので、
R.id.xxx がグローバル変数のような働きをするように見える。


◆◆ 画面のサイズを得る ◆◆


activiti_main.xml を使っている場合は以下の通り。

1. レイアウトに id が付いていないので、id を設定する。

2. 以下のコードでサイズが取得できる

(a) クラスの変数宣言部

    RelativeLayout layout;
    int    dpi, width, width2, height;
    double bairitu;

(b) OnCreate の中

    layout = (RelativeLayout) findViewById(R.id.layout);

    WindowManager wm = getWindowManager();
    Display d = wm.getDefaultDisplay();
    DisplayMetrics dm = new DisplayMetrics();
    d.getMetrics(dm);

    bairitu = dm.density;      // 倍率 : dp × 倍率 = px
    dpi = dm.densityDpi;       // dpi

(c) onWindowFocusChanged をオーバーライド

    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        width = layout.getWidth();
        height = layout.getHeight();
        width2 = width - (int)(16 * 2 * bairitu);
        button1.setWidth( width2 / 2 );
    }

ここでの height は画面上部の「インジケータ用領域」
「アプリの名前を表示する帯状領域」は含まない。

アプリが使用する領域は width, height からレイアウトの padding × 2 を
引いた値である。

activity_main.xml の中を見ると、RelativeLayout に対して

   android:paddingLeft="@dimen/activity_horizontal_margin"

とある。adtivity_horizonal_margin は

  app -- src -- main -- res -- values -- dimens.xml

の中にあり、16dp となっている。

(d) dp, px, mm, pt の変換

dp <--> px

   dm.density で得られた倍率を用いる
   dp × 倍率 = px

px <--> mm

   px ÷ dpi × 25.4 = mm

dp <--> pt

   1 inch = 2.54 cm = 72 pt

ex. 倍率 2 倍, 320 dpi, 横幅 800 px のとき

横幅の px = 800 - 16×2×2 = 736 px

ex. 倍率 1.5 倍, 240 dpi, 横幅 480 px のとき

横幅の px = 480 - 16×1.5×2 = 432 px

ex. 320 dpi, 倍率 2  のとき 20, 24, 28 dp のフォントは

    20 × 2 ÷ 320 × 72 = 9 pt
    24 × 2 ÷ 320 × 72 = 10.8 pt
    28 × 2 ÷ 320 × 72 = 12.6 pt

ex. 240 dpi, 倍率 1.5 のとき 20, 24, 28 dp のフォントは

    20 × 1.5 ÷ 240 × 72 = 9 pt
    24 × 1.5 ÷ 240 × 72 = 10.8 pt
    28 × 1.5 ÷ 240 × 72 = 12.6 pt


◆◆ RelativeLayout の設定 ◆◆


layout:alignparent
   1 つ上の階層のコンポーネントに合わせる
   TextView は left と right にチェックを入れることが多い。

layout:aligncomponent
   同一階層のコンポーネントからの相対位置
   bottom:top    xxxx        自分の下端を xxxx の上端に合わせる
   top:bottom    yyyy        自分の上端を yyyy の下端に合わせる
   left:right    zzzz        自分の左端を zzzz の上端に合わせる

layout:margin
   上で指定したコンポーネントとの間隔

並べ替え
  ドラッグしても大抵はうまくいかない。
  layout:aligncomponent で設定する。

  左下のタブを「Design」から「Text」に切り替えて編集する方法もある。


◆◆ plain textview の文字サイズ ◆◆


typeface monospace 使用時  単位 dp   目視で確認

textsize  行送り         横幅
24        28.5 (1.1875)  14.5 (0.604166)
20        24   (1.2 )    12   (0.6)
16        19   (1.1875)   9.5 (0.59375)

横幅はこれより 0.1dp でも小さくなると、次の行へ送られる。

自動改行の場合、縦幅はこれよし少し小さかったり大きかったりした場合、
行間が自動的に伸び縮みする。


◆◆ ウィジェットをコードで生成し、配置する ◆◆


レイアウトに id (この例では layout) をつける

layout = (RelativeLayout) findViewById(R.id.layout);

TextView tv = new TextView();  // コンストラクタ

tv.setWidth(500);
tv.setHeight(500);
.... 色々な設定

layout.addView(tv);


◆◆ getWidth() getHeight() の怪 ◆◆


    Textview tv;

    tv = (TextView) findViewById(R.id.textView);

    tv.setHeight(300);
    tv.setWidth(200);

    tv.measure(0,0);
    // https://gist.github.com/tuoxie007/10981189
    // から引用。0,0 の意味はよくわからない
    // http://developer.android.com/reference/android/view/View.MeasureSpec.html
    // に書いてあるが・・・

    width = tv.getWidth();
    width2 = tv.getMeasuredWidth();
    height = tv.getHeight();
    height2 = tv.getMeasuredHeight();

とすると、

    width    200
    width2   よくわからない値
    height   activity_main.xml で設定した値
    height2  300

となる。なぜこうなるのか謎。


◆◆ イベントリスナーの書き方 ◆◆


このサイトに詳しくまとめられている。
http://yyyank.blogspot.jp/2013/01/android.html

◆◆ Canvas とボタンを併存させる ◆◆


Blank Activity の Relative Layout を使う。
Canvas を自作の 1 つの部品として製作し、配置する。

http://d.hatena.ne.jp/compound/20110803/1312377989 に書いてある。

1. Canvas のクラスを View を継承して作成する。
2. レイアウトエディタを Text モードにして、そのクラスを手作業で記述する。

一旦、レイアウトエディタが認識すれば、あとは普通の部品と同様に扱える。

1. のサンプル

package com.example.yabu.drawtest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by yabu on 2015/10/02.
 */
public class GView extends View {

    int width, height, fontsize = 40, px, py;

    public GView(Context context, AttributeSet attrs){
        super(context, attrs);
        setBackgroundColor(Color.rgb(213, 213, 213));
    }

    @Override
    protected void onDraw(Canvas canvas){

        width = getWidth();
        height = getHeight();

        Paint paint = new Paint();
        paint.setColor(Color.rgb(255,0,0));
        paint.setStrokeWidth(3);
        paint.setTextSize(fontsize);

        String str = new String();

        str = "width = " + width + "   height = " + height;

        canvas.drawText(str.toString(), 0, fontsize + 2,paint);
        canvas.drawLine(0, 0, width, height, paint);
    }
}

2. のサンプル

<com.example.yabu.drawtest.GView
        android:layout_width="fill_parent"
        android:layout_height="500dp" />

◆◆ タイトルバーをなくす ◆◆


app --- res --- values --- styles.xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

◆◆ メイン画面領域の周辺のマージンをなくす ◆◆


app --- res --- values -- dimens.xml


◆◆ ファイルエクスプローラ ◆◆


Tools --- Android --- Android Device Monitor

File Explore のタブをクリック

ファイルをクリックして、右上の「Pull a file from the device」
をクリックすると、パソコンにコピーできる。


◆◆ external storage へファイル出力 ◆◆


external storage に書き込んだものは、PC と USB 接続したとき、
読み書きできる。

Xperia では変更は逐一 PC から見えるドライブ内のファイルに反映される。

Nexux 7 では PC の USB ドライブから見えるファイルは、最新の状態ではない。
一旦 USB 接続を切り離して、再度接続すると、最新の状態になる。
あるいは Android Device Manager を使ってコピーすると最新の状態が得られる。

AndroidManifest.xml

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

ファイルへ書き込み

    sd_path = Environment.getExternalStorageDirectory().getPath();
    fname = sd_path + "/time.txt";

    try {
        FileOutputStream outs = new FileOutputStream(fname, true);  // append
        BufferedWriter w = new BufferedWriter(new OutputStreamWriter(outs, "UTF-8"));
        w.write(strbuf.toString());
        w.flush();
        w.close();
        outs.close();
    } catch (FileNotFoundException e) {
        Log.e("FileNotFoundException", e.getMessage());
    } catch (IOException e){
        Log.e("IOException", e.getMessage());
    }

PC から見えるようにする。

    MediaScannerConnection.scanFile(getApplicationContext(),
        new String[]{fname},
        new String[]{"text/plain"},
        null);


◆◆ GPS の利用 ◆◆


大部分は https://akira-watson.com/android/gps.html からの引用。

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

MainActivity.java

(1) import 部

import android.location.*;

(2) クラス宣言, クラス変数

public class MainActivity extends AppCompatActivity
        implements LocationListener {

    private LocationManager locationManager;

(3) onCreate()

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    final boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if ( gpsEnabled == false ) {
        Toast.makeText(this, "位置情報を on にして下さい。", Toast.LENGTH_LONG).show();
    }

(4) オーバーライドするメソッド

    setconsole は自作関数なので無視してください

    @Override
    protected void onResume() {

        setconsole("onResume");
        if (locationManager != null) {
            // minTime = 1000msec, minDistance = 50m
            locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 50, this);
            setconsole("locationManager is updated.");
        }
        super.onResume();
    }

    @Override
    protected void onPause() {

        setconsole("onPause");
        if (locationManager != null) {
            // update を止める
            locationManager.removeUpdates(this);
        }
        super.onPause();
    }

    @Override
    public void onLocationChanged(Location location) {

        setconsole("onLocationChanged");
        latitude = location.getLatitude();     // double
        longitude = location.getLongitude();

        s_latitude = String.valueOf(latitude);  // String
        s_longitude = String.valueOf(longitude);

        setconsole("N " + s_latitude + "  E " + s_longitude);
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

        setconsole("onStatusChanged");
        switch (status) {
            case LocationProvider.AVAILABLE:
                setconsole("LocationProvider.AVAILABLE");
                break;
            case LocationProvider.OUT_OF_SERVICE:
                setconsole("LocationProvider.OUT_OF_SERVICE");
                break;
            case LocationProvider.TEMPORARILY_UNAVAILABLE:
                setconsole("LocationProvider.TEMPORARILY_UNAVAILABLE");
                break;
        }

    }

◆◆ 加速度センサーの利用法 ◆◆


参考サイト
//  http://seesaawiki.jp/w/moonlight_aska/d/%B2%C3%C2%AE%C5%D9%A5%BB%A5%F3%A5%B5%A1%BC%A4%CE%C3%CD%A4%F2%BC%E8%C6%C0%A4%B9%A4%EB

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    public TextView tv;
    public SensorManager sm;
    double ax, ay, az;

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

        tv = (TextView) findViewById(R.id.textView);
        sm = (SensorManager)getSystemService(SENSOR_SERVICE);

        ax = 0;
        ay = 0;
        az = 9.8;

    }

    @Override
    protected void onStop() {
        super.onStop();
        sm.unregisterListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER);
        if (sensors.size() > 0) {
            Sensor s = sensors.get(0);
            sm.registerListener(this, s, SensorManager.SENSOR_DELAY_UI);
        }
    }

    @Override
    public void onSensorChanged(SensorEvent e) {
        double x_now, y_now, z_now;
        String str;
        if( e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

            x_now = fix_value(e.values[0]);
            y_now = fix_value(e.values[1]);
            z_now = fix_value(e.values[2]);

            if ( ax != x_now || ay != y_now || az != z_now ) {
                ax = x_now;
                ay = y_now;
                az = z_now;

                str = String.format("accel: x(%5.1f)  y(%5.1f)  z(%5.1f)",ax,ay,az);
                tv.setText(str);
            }
        }
    }

    //----------- 値を四捨五入する ----------

    public double fix_value(double in) {
        int keta = 1;        // 小数点以下何桁目まで有効にするか
        double multi, ret;

        multi = Math.pow(10,keta);
        ret = Math.round(in * multi) / multi;

        return ret;
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }