前回は、Activityのライフサイクルで必要なオーバーライドメソッドを記述していきました。必要なオーバーライドメソッドを記述した時点で、修正可能なエラーを直していくと、以下の7項目のエラーが残ります。
同じ内容のエラーがありますので、まとめると5種類のエラーになります。
上記5つのエラーは、各々ソースを記述する必要があるため、ひとつづつ概要を説明しソースを記述していきましょう。
4. プライベート・メソッド、パブリックメソッドの記述
エラー「mUsbReceiver cannot be resolved to a variable」
mUsbReceiverはブロードキャストレシーバーになります。
IntentFilterクラスのfilterインスタンスでセットされたUSB接続の2つのアクション(独自インテントとUSB接続取り外し)が起きたときに呼び出される処理です。
4.1. フィールドとonCreateメソッドの間にmUSBReceiverインスタンスフィールドを記述します(下図では40行目)。カーソルを移動させてください。
4.2. BroadcastReceiverクラスのmUsbReceiverのソースは以下の通りです。貼付けてください。
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { // Intent からアクセサリを取得 UsbAccessory accessory = UsbManager.getAccessory(intent); // パーミッションがあるかチェック if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { // 接続を開く openAccessory(accessory); } else { Log.d(TAG, "permission denied for accessory " + accessory); } mPermissionRequestPending = false; } } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) { // Intent からアクセサリを取得 UsbAccessory accessory = UsbManager.getAccessory(intent); if (accessory != null && accessory.equals(mAccessory)) { // 接続を閉じる closeAccessory(); } } } };ファイルを保管します。これで「mUsbReceiver cannot be resolved to a variable」エラーは消えました。
エラー「メソッド openAccessory(UsbAccessory) は型 MainActivity で未定義です」
エラー「メソッド closeAccessory() は型 MainActivity で未定義です」
エラー「メソッド enableControls(boolean) は型 MainActivity で未定義です」
enableControlsメソッドは、プライベートメソッドです。
トグルボタンの状態をTextViewに表示し、使用可能にします。
エラー「メソッド sendCommand(byte, byte) は型 new CompoundButton.OnCheckedChangeListener(){} で未定義です」
sendCommandメソッドは、パブリックメソッドです。
トグルボタンが押されたとき、Arduino側にLEDをオン/オフさせる命令(独自のプロトコル)を送ります。
4.3. 上記4つのエラーについて、各ソースを記述します。onResumeメソッドとrunメソッドの間に記述します。アウトラインで、「run(): void」をクリックしてrunメソッド先頭まで移動します。
4.4. onResumeメソッドとrunメソッドの間に、4つのメソッドのソースを記述してください(上図では154行目になります)。
private void openAccessory(UsbAccessory accessory) { // アクセサリにアクセスするためのファイルディスクリプタを取得 mFileDescriptor = mUsbManager.openAccessory(accessory); if (mFileDescriptor != null) { mAccessory = accessory; FileDescriptor fd = mFileDescriptor.getFileDescriptor(); // 入出力用のストリームを確保 mInputStream = new FileInputStream(fd); mOutputStream = new FileOutputStream(fd); // この中でアクセサリとやりとりする Thread thread = new Thread(null, this, "DemoKit"); thread.start(); Log.d(TAG, "accessory opened"); enableControls(true); } else { Log.d(TAG, "accessory open fail"); } } private void closeAccessory() { enableControls(false); try { if (mFileDescriptor != null) { mFileDescriptor.close(); } } catch (IOException e) { } finally { mFileDescriptor = null; mAccessory = null; } } private void enableControls(boolean enable) { if (enable) { mStatusView.setText("connected"); } else { mStatusView.setText("not connected"); } mToggleButton.setEnabled(enable); } // アプリ -> アクセサリ public void sendCommand(byte command, byte value) { byte[] buffer = new byte[2]; if(value != 0x1 && value != 0x0) value = 0x0; // 2byte の独自プロトコル // 0x1 0x0 や 0x1 0x1 buffer[0] = command; buffer[1] = value; if (mOutputStream != null) { try { mOutputStream.write(buffer); } catch (IOException e) { Log.e(TAG, "write failed", e); } } }4.5. 上記4つのメソッドを記述して、ファイルを保管してください。エラーは3つのみになります。
これら3つのエラーは、パッケージのインポートで解決しますので、赤×をダブルクリックしてエラー修正を行ってください。
これで赤×はなくなりましたが、スレッドが動作する際に実行されるrunメソッドの中身が記述されていません。
4.6. 再度runメソッドに移動し、以下のJavaソースを記述してください。
// ここでアクセサリと通信する @Override public void run() { int ret = 0; byte[] buffer = new byte[16384]; int i; // アクセサリ -> アプリ while (ret >= 0) { try { ret = mInputStream.read(buffer); } catch (IOException e) { break; } i = 0; while (i < ret) { int len = ret - i; switch (buffer[i]) { case 0x1: // 2byte の独自プロトコル // 0x1 0x0 や 0x1 0x1 など if (len >= 2) { Message m = Message.obtain(mHandler, MESSAGE_LED); m.obj = new LedMsg(buffer[i + 1]); mHandler.sendMessage(m); } i += 2; break; default: Log.d(TAG, "unknown msg: " + buffer[i]); i = len; break; } } }4.7. 上記ソースを記述してファイルを保管してください。エラーが6項目でてきます。
「Messageを解決できません」をダブルクリックして、Messageクラスのインポートだけ行います。
エラーが4項目に減ったはずです。
次にメッセージキューイングを行うハンドラを記述してMainActivityを完成させましょう。
0 件のコメント:
コメントを投稿