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環境ではAtomやVisual 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スレッドで処理を行うと書けば良い。
ターミナルの忘れがちな便利コマンド
USBの場所
cd /Volumes/<USB名>
ファイル容量を調べる
du
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=...
と簡略化することができる。便利!
細かいパラメータ
<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画面でよい。