korechi’s diary

とあるVR/ARエンジニアのブログ

SmartEyeGlassでセンサーを使う方法

センサーの値を取得するには
1. SensorManager のオブジェクトを取得する
2. SensorManager オブジェクトにセンサーのリスナーを登録する
3. センサーの値を取得する
を行う必要がある。具体的には

sensorManagerを取得し、そこからセンサーを取得

private AccessorySensorManager sensorManager;
private AccessorySensor sensor = null;

sensorManager = new AccessorySensorManager(context, hostAppPackageName);
// 方位センサー
sensor = sensorManager.getSensor(SensorTypeValue.MAGNETIC_FIELD);
// 加速度センサー
sensor = sensorManager.getSensor(SensorTypeValue.ACCELEROMETER);
// 輝度センサー
sensor = sensorManager.getSensor(SensorTypeValue.LIGHT);

オブジェクト(センサー)にリスナーを登録し、値を使う

try {
  sensor.registerListener(new AccessorySensorEventListener() {
    @Override
    public void onSensorEvent(final AccessorySensorEvent ev) {
      // 値を使う例
     float[] v = ev.getSensorValues();
    }
  }, Sensor.SensorRates.SENSOR_DELAY_NORMAL, 0);
} catch (AccessorySensorException e) {
  Log.d(Constants.LOG_TAG, "Failed to register listener");
}

これらをControlExtensionを継承したクラスのonResume()内などでやればよい

終了する時はonPause()などの中に

sensor.unregisterListener();
sensor = null;

を記述してリスナーを外すのを忘れないように

Visual Studio Codeをインストールしてみた

SONYインターンに参加してた時に社員さんにAtomを使ってると言ったら"Visual Studio Codeも使ってみなよー"と言われたのでとりあえずインストール。

軽く触ってみた感じなかなか便利そう。
今までMacではxamarin studioを使ってたんだけどMacでしか使えないから、Windows環境ではAtomVisual StudioなどOSによってエディタを変えていました。
けれど、これってめんどくさいよね(最近インターンでPC環境が変わることが多い)ってことで、Visual Studio Codeを使ってみようという。

ちょっくら調べたことを載せておきます。

便利コマンド

キー 動作
cmd + p ファイル検索
ctrl + tab 直近で開いたファイルを表示・選択
shift + cmd + p コマンドパレット
ctrl + クリック 画面を分割して表示
F12 定義に移動
Shift + F12 参照を表示
ctrl + g 行目に移動

Android Studio のショートカット

Android Studioを使った開発の効率が上がりそうなショートカットたち

ショートカットキー

記号 キー
^ control
command
alt/option
shift

使えそうなショートカット

組み合わせ 意味
⌥ + Enter クイックフィックス
⌘ + b 選択されたクラスの定義に移動&参照を表示
⌃ + h クラス階層表示。クラスを移動できる
⌘ + n コンストラクタやGetterSetter等を生成
⌘ + r replace
⌘ + ⇧ + f そのテキストを検索

Androidアプリ開発メモ

スレッド処理

AndroidのUIに関する部分はシングルスレッドで動作することしか許されていないため、UIはシングルスレッドで動作させなければいけない。
それに違反すると

CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

と怒られる。なので

private TextView mTextView;

mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    // mTextView.setVisibility(View.VISIBLE);
  }
}

のように明示的にUIスレッドで処理を行うと書けば良い。

画面遷移

アプリで画面遷移を行うには、res/layout/下にsub_activity.xmlを作成し、SubActivity.java内で

public class SubActivity extends WearableActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub_activity);
    }
}

と記述する。また、Manifest内にもMainのと同じ列に

<activity
            android:name=".SubActivity"
            android:label="@string/app_name" >
 </activity>

を追加する。
これをMainActivityかどこか画面遷移を行いたいタイミングで

Intent intent = new Intent(getApplication(), SubActivity.class);
startActivity(intent);

スレッド処理

AndroidのUIに関する部分はシングルスレッドで動作することしか許されていないため、UIはシングルスレッドで動作させなければいけない。
それに違反すると

CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

と怒られる。なので

private TextView mTextView;

mActivity.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    // mTextView.setVisibility(View.VISIBLE);
  }
}

のように明示的にUIスレッドで処理を行うと書けば良い。

Android Studioでの開発

BackspaceキーをCtl+hで

ここを読めば解決する。 takatoshiono.hatenablog.com

コールバック関数とは

呼び出し先の関数に対してコールバック関数(の)引数として送ることで、呼び出し先から任意のコールバック関数を実行させてコールバック関数に実行制御を移すことができる。

電話を相手に一度かけ、電話番号だけ伝えて相手にかけなおしてもらうことからこの名前がついている。

exceptionを受け取る際はtry, catchで囲む

上の通り

string->int変換

String str = "124";
int i = Integer.parseInt(str);

if文を1行で書く

Android開発関係ないけど、忘れがちなので

int a;
(a == 1 ) ? 1 : 0; 

aが1なら1, そうじゃないなら0

Android開発で使われるXMLファイルとは

ビューの定義に使用される。場所は/res/layout/main_activity.xmlのように置かれる。
これをダブルクリックするとビューが表示され、グラフィカルに操作できる。下のタブを操作するとテキスト入力もできる。
アクティビティに配置できるビューは1つだが、ビューグループを使って複数記述出来る。

<?xml version="1.0" encoding="utf-8"?>
<ViewGroup>
    <View />
    <ViewGroup>
        <View />
    </ViewGroup>
</ViewGroup>

しかし、実際にビューを作るには幅や高さ、その中にいれる文字などを指定する必要がある。

ルート要素(LinerLayout)

XMLファイルの中でXML宣言の次に記述され、他の要素は全てルート要素の中に記述される。
お約束としてxmlns:android="http://schemas.android.com/apk/res/android"を記載する。
これはパラメータがandroidで定義されているというタグつけのためにある。そこで、名前空間としてこのように宣言される。
これを書くことで、textを宣言したい場合に、Androidで定義されたということを明示するため

{http://schemas.android.com/apk/res/android}text=...

と書かなきゃいけないところを

xmlns:android="http://schemas.android.com/apk/res/android"
android:text=...

と簡略化することができる。便利!

細かいパラメータ

  • 幅:「android:layout_width」
  • 高さ:「android:layout_height」を表すパラメータを使った例を以下に示す。
<TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

「fill_parent」は最大横幅、「wrap_content」表示に必要なサイズ

  • 文字をどう並べるか:「android:orientation」

ビューの配置

Androidクラスの中では、Activityクラスに用意されているsetContentViewメソッドを使ってビューを表示する。

public class MainActivity extends WearableActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
    }
}

引数には、引数にはアクティビティに設定するビューが定義されたXMLファイルを表すIDを指定する。
決められた場所に置かれてビルドされたリソースはIDが自動的に「R」クラスに記述される。
たとえば「main.xml」ファイルに対しては「R.layout.main」という変数が自動的に定義される。

Androidアプリ制作の際に出てくる謎のワードたち

Context

アプリケーションの環境情報等をAndroidSystem間で受け渡す際のインターフェース。
アクティビティの起動やブロードキャスト、インテントの受け取りといった他のアプリからの応答を行え、アンドロイド特有のリソース・クラスにアクセス可。
つまり、アプリの状態の受け渡しを行うためにContextを渡す(らしい)

  • ActivityのContext
    を取得するには、(Activityを継承してるクラスで)thisで呼ぶ
  • ApplicationのContext を取得するには、getApplicationContext()を呼ぶ

thisで受け取る情報とgetApplicationContext()で受け取る情報は同じらしいが、getApplicationContext()の方が良いらしい。。

Intent

インテントには「意図」「目的」という意味があり、主にアクティビティを起動する際のパラメータに使われる

  • 明示的インテント
    アクティビティを直接指定して起動
  • 暗黙的インテント
    明示的に起動させるアクティビティを指定せずにインテントのパラメータに起動するアクティビティをある程度推測できるだけの情報(インテントフィルター)を入れておくと、該当するアクティビティが起動するようになっている。
    (該当するアクティビティが複数ある場合はユーザーが起動するアクティビティを選択するダイアログが表示されます。該当するアクティビティがない場合は起動に失敗します。)

つまり、起動元からは実際に起動するアクティビティが何なのかはわからない。

明示的インテントの使用例

   Intent intent = new Intent(this, xxx.xxx.xxx.class); //xxxにはパッケージのパスが入る
   startActivity(intent);

暗黙的インテントの使用例

 Intent intent = new Intent();
 intent.setAction(Intent.ACTION_SEND);
 intent.setType("image/jpeg");
 intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("jpegファイルの場所"));
 startActivity(intent);

インスタンスとオブジェクト

インスタンス…クラスの実体(new Hoge()自体)
オブジェクト…インスタンスやクラスの総称
クラス…オブジェクトを表現したもの

Activity

Androidアプリの中核を成す概念で,アプリのライフサイクルや画面遷移に密接に関わるオブジェクト。
Activity=アプリ上の1画面でよい。