質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

4回答

15582閲覧

Android USBホスト機能を使ってシリアル通信したい。

murakami-kurio

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/05/28 06:13

編集2019/07/08 07:02

前提・実現したいこと

普段C言語で、PICマイコンと戯れております。
AndroidもJavaも初挑戦で、
Android USBホスト機能を使ってシリアル通信しようとしたら、できませんでした。

発生している問題・エラーメッセージ

AndroidのUSBホスト機能でArduinoとシリアル通信する
を、丸写ししたつもりなのですが、通信できません。
(ビルドが通るところまでは自力でがんばりました)

具体的には、通信相手をつないでもusbがNULLのままです。

該当のソースコード

MainActivity.java
activity_main.xml
(文字数が...と出たので削除)

helloworld4/app/src/main/res/xml/device_filter.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<resources> 3 <!-- 0x067B / 0x2303: USB serial232c ok --> 4 <usb-device vendor-id="1659" product-id="8963" /> 5 6 <!-- 0x067B / 0x2303: USB serial232c --> 7 <usb-device vendor-id="1659" product-id="8963" /> 8 9 <!-- 0x0403 / 0x6001: FTDI FT232R UART --> 10 <usb-device vendor-id="1027" product-id="24577" /> 11 12 <!-- 0x0403 / 0x6015: FTDI FT231X ok --> 13 <usb-device vendor-id="1027" product-id="24597" /> 14 15 <!-- 0x2341 / Arduino --> 16 <usb-device vendor-id="9025" /> 17 18 <!-- 0x16C0 / 0x0483: Teensyduino --> 19 <usb-device vendor-id="5824" product-id="1155" /> 20 21 <!-- 0x10C4 / 0xEA60: CP210x UART Bridge --> 22 <usb-device vendor-id="4292" product-id="60000" /> 23 24 <!-- 0x067B / 0x2303: Prolific PL2303 --> 25 <usb-device vendor-id="1659" product-id="8963" /> 26 27 <!-- 0x1a86 / 0x7523: Qinheng CH340 --> 28 <usb-device vendor-id="6790" product-id="29987" /> 29</resources>

該当のソースコード(2019/05/29 17:00修正版)

MainActivity.java

java

1package xx.xx.xxxx.helloworld5; 2 3import android.content.Context; 4import android.support.v7.app.AppCompatActivity; 5import android.os.Bundle; 6import java.io.*; 7import android.hardware.usb.*; 8import android.util.Log; 9import android.widget.TextView; 10import com.hoho.android.usbserial.driver.*; 11 12public class MainActivity extends AppCompatActivity { 13 UsbSerialDriver usb; 14 int counter = 0; 15 int counter2 = 0; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 22 UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); 23 usb = UsbSerialProber.acquire(manager); 24 if (usb != null) { 25 try{ 26 usb.open(); 27 usb.setBaudRate(19200); 28 start_read_thread(); // シリアル通信を読むスレッドを起動 29 } 30 catch(IOException e){ 31 e.printStackTrace(); 32 } 33 counter++; 34 String str = String.valueOf(counter); 35 TextView my_counter = findViewById(R.id.counter_text); 36 my_counter.setText(str); 37 38 while(true) { 39 try { 40 usb.write("o".getBytes("UTF-8"), 1); 41 } catch (UnsupportedEncodingException e) { 42 // 発生し得ないが、書くしかない 43 // https://qiita.com/niharu/items/662b130149ee180f7f34 44 } catch (IOException e) { 45 e.printStackTrace(); 46 } 47 } 48 } else { 49 counter2++; 50 String str2 = String.valueOf(counter2); 51 TextView my_counter2 = findViewById(R.id.counter_text2); 52 my_counter2.setText(str2); 53 } 54 } 55 public void start_read_thread(){ 56 new Thread(new Runnable(){ 57 public void run(){ 58 try{ 59 while(true){ 60 byte buf[] = new byte[256]; 61 int num = usb.read(buf, buf.length); 62 if(num > 0) Log.v("Arduino", new String(buf, 0, num)); // Arduinoから受信した値をlogcat出力 63 Thread.sleep(10); 64 } 65 } 66 catch(IOException e){ 67 e.printStackTrace(); 68 } 69 catch (InterruptedException e) { 70 e.printStackTrace(); 71 } 72 } 73 }).start(); 74 } 75}

AndroidManifest.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="xx.xx.xxxx.helloworld5"> 4 <uses-feature android:name="android.hardware.usb.host" /> 5 <!-- https://blog.integrityworks.co.jp/2017/12/20/permission-is-only-granted-to-system-app/ --> 6 <uses-permission android:name="android.permission.MANAGE_USB" /> 7 <application 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/AppTheme"> 14 <activity android:name=".MainActivity"> 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 <action android:name="android.intent.action.VIEW"/> 18 19 <category android:name="android.intent.category.LAUNCHER" /> 20 </intent-filter> 21 <intent-filter> 22 <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 23 </intent-filter> 24 <meta-data 25 android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 26 android:resource="@xml/device_filter" /> 27 </activity> 28 </application> 29 30</manifest>

helloworld4/app/src/main/res/xml/device_filter.xml
は、そのままです。

試したこと

シリアルの端末がつながると、counter_textに1が入るはずなのに、
counter_text2に1が入る。

(古いソースでは、スイッチの反応がなくなるはずなのに、
ボタンをタップすると数値がインクリメントされる。)

補足情報(FW/ツールのバージョンなど)

シリアルの端末がつながると、ポップアップで許可を求めてきます。
API19
Android Studio 3.4です。
Q88というAndroid 4.4の実機で試しています。

#####ここにより詳細な情報を記載してください。
ライブラリーとして、
usb-serial-for-android-v010.jar(どこで拾ったのかわからなくなっている)
を取り込んでいます。
usb-serial-for-androidのグーグルコードが消えてしまって、情報が半分くらい
消え去っている。(githubに飛ばされた)
githubに公開されている、ライブラリのソースは読んでいない...です。すいません。
usb-serial-for-androidのgithub

次の2つのシリアル通信を試しました。

IOデータ USB-RSAQ6 usb-device vendor-id="1659" product-id="8963" 秋月電子通商のFT234X 超小型USBシリアル変換モジュール usb-device vendor-id="1027" product-id="24597"

Q88のadbがなくて、ちまちまリリース用のakpをファイル転送してテストしています。

よろしくお願いいたします。

追加情報

ソースコードをリンク先に近い形にしました。

通信相手をつないで『アプリの画面の R.id.button ボタンを
押しても』usbがNULLのまま, という解釈であっていますでしょうか.

はい。

なんのスイッチでしょう.

『アプリの画面の R.id.button ボタン』です。

どのような「許可」を求められるのでしょうか

Open アプリ名 when this USB device is connected?
□Use by default for this USB device
「Cancel」「 OK」
で、チェックマークを入れずにOKをタップした後、
ボタンの反応しますので、usbがnullと判断しています。

マニフェストに
<uses-permission android:name="android.permission.MANAGE_USB" />
を追記してみましたが、変わりませんでした。

AndroidのUSBホスト機能を緩く使ってみる
に従って、getDeviceListしてみました。
シリアル機器をUSBに接続すると
/dev/bus/001/026
と出ました。

送信ができました。(ご報告)(2019年6月中旬)

usb-serial-for-androidを使わない方法で、送信ができました。
AndroidのUSBホスト(OTG)機能を使って、接続されたArduinoとシリアル通信してみる話
を参考にしました。(ぐぐったり、null pointerに悩まされながら)
受信は、
自作のUSBデバイスを、Androidで動かす
を参考にやろうと思います。
両方できたら、「自己解決(いろいろお世話になっていますが...)」と
しようと思います。
よろしくお願いいたします。

受信ができませんでした。(ご報告)(2019July04)

いろいろ、インターネットをさまよったのですが、
serialドライバーを使わない方法での受信ができませんでした。

FTDI社のFT232RL用ドライバーを使ったら、FT234Xは通信ができた。(2019July04)

Fab蔵さんのページ:201. USB Host事前準備 から続く内容を実行したら動きました。
これをもって、自己解決としたいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/05/29 02:18

> 通信相手をつないでもusbがNULLのまま 「通信相手をつないで」というイベントに対してアプリが何かするようなコードにはなっておりません. 通信相手をつないで『アプリの画面の R.id.button ボタンを押しても』usbがNULLのまま, という解釈であっていますでしょうか. > シリアルの端末がつながると、スイッチの反応がなくなる なんのスイッチでしょう. > シリアルの端末がつながると、ポップアップで許可を求めてきます。 どのような「許可」を求められるのでしょうか
murakami-kurio

2019/05/29 02:55

いろいろすみません。 >通信相手をつないで『アプリの画面の R.id.button ボタンを >押しても』usbがNULLのまま, という解釈であっていますでしょうか. はい。 >なんのスイッチでしょう. 『アプリの画面の R.id.button ボタン』です。 >どのような「許可」を求められるのでしょうか Open アプリ名 when this USB device is connected? □Use by default for this USB device 「Cancel」「 OK」 で、チェックマークを入れずにOKをタップした後、 ボタンの反応しますので、usbがnullと判断しています。 お手間を取らせて申し訳ありませんが、よろしくお願いいたします。
guest

回答4

0

usb が常に null になっているのだと思います。

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); usb = UsbSerialProber.acquire(manager);

usb が正しく取得できているか Log.i("TAG", "usb:" + usb) 等で確認してみて下さい。

投稿2019/05/28 10:05

kamikaze.cappa

総合スコア558

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murakami-kurio

2019/05/29 00:34

「usb が常に null になっている」のをなんとかしたい。のですが...。 Log...は、adbの機能ですか?Android(Q88)のadbが見つからないのですが...。 if文の条件分岐で、常にnullになっていることは、確認できているつもりです。 なにぶん手をつけて間がないので、間違ったこといってたら、ご指摘ください。 よろしくお願いいたします。
murakami-kurio

2019/05/29 04:14

ありがとうございます。 やってみます。
murakami-kurio

2019/05/30 00:37

シリアル機器をUSBに接続すると /dev/bus/001/026 と出ました。
kamikaze.cappa

2019/05/30 06:03

http://systemp.hatenablog.com/entry/2013/04/07/184333 この辺りは大丈夫でしょうか? ``` 必要なものは、以下のとおり ・USBホスト機能をもっているAndroid端末  バージョンが3.1以上であればよいかというと、そういう分けでもないようです。  端末によって、対応してたりしてなかったり。 ・USBホストケーブル  ホスト対応したものが、必要なので要注意です。 ```
murakami-kurio

2019/05/30 07:15

ご指摘いただき、ありがとうございます。 >USBホスト機能をもっているAndroid端末 OGTと記載されているものを買いました。 >USBホストケーブル 付属のものを使っています。 USBメモリをつないだところ、ファイルが見られました。 なにかありましたら、また、教えてください。
kamikaze.cappa

2019/05/30 08:08

ちょっとハードの問題かソフトの問題か切り分けが難しいですね ライブラリーにはサンプルプログラムを入っているようです。 そちらで確認してみてはどうでしょうか? ``` git clone https://github.com/mik3y/usb-serial-for-android.git cd usb-serial-for-android/ ./gradlew ./gradlew build find . -name "*.apk" ./usbSerialExamples/build/outputs/apk/usbSerialExamples-debug-unaligned.apk ./usbSerialExamples/build/outputs/apk/usbSerialExamples-debug.apk ./usbSerialExamples/build/outputs/apk/usbSerialExamples-release-unsigned.apk ``` git が使えなければ、ZIPダウンロード解凍でもできます。
jimbe

2019/05/30 08:16

OTG(On The Go)ですね.
murakami-kurio

2019/06/03 04:20

いろいろありがとうございます。 OTGでしたか。 ちょっと、*.apkの元になるファイルの見つけ方がわからなかったのですが、 usbSerialExamples の下のほうに、 SerialConsoleActivity.javaというファイルがあり、この中のusbの取得が、 final UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); UsbDeviceConnection connection = usbManager.openDevice(sPort.getDriver().getDevice()); となっており、参考にさせていただいているサイトとは違いました。 これ、やってみたいと思います。
murakami-kurio

2019/06/04 08:21

com.hoho.android.usbserial.driver.UsbSerialPort がドライバーに含まれてなくて、ビルドがうまく通りませんでした。すみません。
kamikaze.cappa

2019/06/04 11:43

https://github.com/mik3y/usb-serial-for-android.git 上記のサイトで緑色のボタンです。 clonr or download で download.zip で入手できます。 以下のコマンドでビルドします cd usb-serial-for-android/ ./gradlew.bat ./gradlew.bat build 下記の場所にAPKが出来るので試してみてください。 ./usbSerialExamples/build/outputs/apk/usbSerialExamples-debug.apk
murakami-kurio

2019/06/05 00:58 編集

usb-serial-for-android-master というのが、ダウンロードできました。 Windows7なのですが、./をうけつけなくて、なしで、実行したところ、 gradlew.bat buildで、 BUILD FAILED となりました。 エラーは、 :usbSerialForAndroid:compileReleaseJava FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':usbSerialForAndroid:compileReleaseJava'. > Cannot find System Java Compiler. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME system variable to point to the according directory. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED です。ちょっとわかりませんでした。よろしくお願いいたします。 (Javaのインストールがうまく行ってない?とか。)
murakami-kurio

2019/06/05 05:13 編集

ありがとうございます。 以下のようになりました。パスは通っていると見ていいんですよね? C:...\usb-serial-for-android-master>java -version java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode) C:...\usb-serial-for-android-master>set JAVA_HOME JAVA_HOME=C:\Program Files\Java\jdk1.8.0_211_ ...と思ったら、アンダーバーが付いてた。これか? C:\Program Files\Java\jdk1.8.0_211 と C:\Program Files\Java\jdk1.8.0_211_ があるけど...。(記憶が...)
kamikaze.cappa

2019/06/05 05:24

パスが通れば gradlew.bat build のエラーが解消されるか、別のものなると思います。
murakami-kurio

2019/06/05 06:23

どうもありがとうございます。 ターミナルの表示は上記でしたが、 環境変数のところに、JAVA_HOMEがありませんでした。 pathもエディターにコピペして検索かけたのですが、 一致するものはありませんでした。すみません。 jdk1.8.0_211に統一し、設定しなおしたところ、 ビルドが通りました。 ...それでなのですが、インストールして動かしてみたところ、 USB Serial Example 1 device(s) found Vendor 0403 Product 6015 と出ました。(秋月のほう) うーむ。どうしたらいいでしょうか。よろしくお願いいたします。
kamikaze.cappa

2019/06/05 07:13

以下の場所にライブラリーが生成されます。 ./usbSerialForAndroid/build/outputs/aar/usbSerialForAndroid-debug.aar libs フォルダーにコピーして使用してください。 もとあるものは削除したほうがよいかも 以下の、snippet を参考してアクセス方法を変えてみて下さい。 https://github.com/mik3y/usb-serial-for-android
kamikaze.cappa

2019/06/05 07:18

あれ、目的のデバイスは、認識されていないと言う事でしょうか?
murakami-kurio

2019/06/06 00:57

紛らわしい書き方をしてすみません。 秋月のが目的のデバイスですので、認識されています。 ライブラリとsnippetありがとうございます。 こちらを使ってやって見ます。
murakami-kurio

2019/06/06 05:41

ちょっと、別な用事が入ってしまいました。 Android Studio で AARファイルを作って読み込む https://qiita.com/izuki_y/items/bd61a2cf8473bf6bd9fb を参考に、aarファイルを読み込んで snippetをAndroidManifest.xmlとMainActivity.javaとに書き込んで、 ビルドを通して実機で動かすところまでいきました。それでなのですが、 USBをさしたときに出てくるアプリの候補に、作ったアプリがありません。 AndroidManifest.xmlの <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> は、書きました。 あまり、原因究明を行っておらず申し訳ないのですが、 現状報告ということで一旦Androidから離れます。 よろしくお願いいたします。
murakami-kurio

2019/06/06 06:26

あっさり終わりました。 またAndroidやります。
murakami-kurio

2019/06/06 08:18

https://github.com/mik3y/usb-serial-for-android のMainActivity.javaのうち、 if (availableDrivers.isEmpty()) { シリアルデバイスを接続すると、のif文には入らなくなりました。 (接続しないと、入る) if (connection == null) { のif文に入ってしまい、 UsbSerialPort port = driver.getPorts().get(0); まで、たどり着かないようです。 UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); がnullになるようです。 usbSerialForAndroid-release.aar を使用してリリースのapkを インストールするようにしました。 これでなにか、わかりますでしょうか? よろしくお願いいたします。
murakami-kurio

2019/06/07 02:16

List<UsbSerialDriver>型の値、というのがよく理解できません。 すいません。 参考URLなのですが、 adbが機能してなくWi-Fiデバッグもできていません。 シミュレータでのデバッグの結果は、 availableDrivers = {ArrayList@831696366120} size = 0 でした。 実機で、 String s = String.valueOf(availableDrivers.size()); TextView textView = findViewById(R.id.textView); textView.setText(s); としたところ、1が表示されました。 よろしくお願いいたします。
murakami-kurio

2019/06/07 07:45 編集

新たな質問で申し訳ありません。 Permissionかも、と、チェックしようと、下記サイト参考に、 https://keiorogiken.wordpress.com/2016/12/07/android%E3%81%A8arduinouno%E3%81%AE%E9%80%9A%E4%BF%A1%E4%BB%95%E6%96%B9/ if (manager.hasPermission(availableDrivers) { //許可した。コネクトするぞい } else { String s = "return20190607-2"; TextView textView = findViewById(R.id.textView); textView.setText(s); } としたのですが、availableDriversが、 Cannot resolve method 'hasPermission(java.util.List<com.hoho.android.usbserial.driver.UsbSerialDriver>)' とエラーになってしまいます。availableDrivers(0) もだめでした。 修正方法がわかれば教えてください。 よろしくお願いいたします。 追記。 サイトに書いてあることは、 if (manager.hasPermission(device)) { //許可した。コネクトするぞい } なのですが、deviceを代入しているところが見つからないです。
jimbe

2019/06/07 07:51

manager.hasPermission のパラメータは availableDrivers では無く (availableDrivers.size() が 1 であれば) availableDrivers.get(0).getDevice() ではないでしょうか.
murakami-kurio

2019/06/07 08:15

ありがとうございます。 ビルド、通りました。
murakami-kurio

2019/06/07 08:21

動かしてみたところ、 if (manager.hasPermission(availableDrivers.get(0).getDevice())) { //許可した。コネクトするぞい } else { String s = "return20190607-2"; TextView textView = findViewById(R.id.textView); textView.setText(s); } で、return20190607-2 が表示されます。
jimbe

2019/06/14 08:42

device として availableDrivers.get(0).getDevice() を使用して > PendingIntent intent = PendingIntent.getBroadcast(mainActivity, 0, new Intent("com.○○.○○○.USB_PERMISSION"), 0); > manager.requestPermission(device, intent); を実行しておく必要があるのではないでしょうか. このコードによって USB を使うことを許可するかのポップアップが表示され, 許可すれば, `manager.hasPermission(device)` が true を返すのではないかと思います.
murakami-kurio

2019/07/04 02:08

遅くなってすみません。 ご指摘の内容、「com.○○.○○○.USB_PERMISSION」の「○」に、 何を入れてよいかわからず、実行できないでいます。 何を入れるべきでしょうか?教えてください。 お手数おかけして申し訳ありません。
murakami-kurio

2019/07/04 02:10

この件の、MainActivity.java を貼っておきます。 package xx.xx.xxxx.helloworld9; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import com.hoho.android.usbserial.driver.UsbSerialDriver; import com.hoho.android.usbserial.driver.UsbSerialPort; import com.hoho.android.usbserial.driver.UsbSerialProber; import java.io.IOException; import java.io.UnsupportedEncodingException; //import java.util.HashMap; //import java.util.Iterator; import java.util.List; public class MainActivity extends AppCompatActivity { //private HashMap<String, UsbDevice> deviceList; //private UsbDevice mUsbDevice; //private UsbManager my_manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Find all available drivers from attached devices. UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); //my_manager = (UsbManager) getSystemService(Context.USB_SERVICE); List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.size() == 0) { //String s = "return20190606"; return; } else { // String s = String.valueOf(availableDrivers.size()); } //deviceList = my_manager.getDeviceList(); //Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); //while (deviceIterator.hasNext()) { // mUsbDevice = deviceIterator.next(); //} if (manager.hasPermission(availableDrivers.get(0).getDevice())) { //許可した。コネクトするぞい } else { String s = "return20190607-2"; TextView textView = findViewById(R.id.textView); textView.setText(s); } // Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); if (connection == null) { // You probably need to call UsbManager.requestPermission(driver.getDevice(), ..) // String s = "return20190607"; return; } // Read some data! Most have just one port (port 0). UsbSerialPort port = driver.getPorts().get(0); try { port.open(connection); port.setParameters(19200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); try { String my_write = "s\n\r"; port.write(my_write.getBytes("UTF-8"), my_write.length()); } catch (UnsupportedEncodingException e) { // 発生し得ないが、書くしかない // https://qiita.com/niharu/items/662b130149ee180f7f34 } catch (IOException e) { e.printStackTrace(); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } byte buffer[] = new byte[16]; int numBytesRead = port.read(buffer, 1000); Log.v( "Read ", numBytesRead + " bytes."); //String s = String.valueOf(numBytesRead); } catch (IOException e) { // Deal with error. } finally { try { port.close(); } catch (IOException e) { // Deal with error. } } } }
murakami-kurio

2019/07/19 06:44

やってみたのですが、秘密key?のパスワードが消えてしまい、 さらに、鍵を再設定したら、パスがおかしいよう (Android Studioを立ち上げたまま、プロジェクトの入ったフォルダーを  コピーしようとしたのが原因らしい...MainActivity.javaの親戚みたいな  ファイルが生成されていたりする)で、実機でテストできず、 同じようにプロジェクトを新たに作り直したつもりなのですが、 エラーが出てビルドが通らず...この件は検証なしでお願いしたく。 (一応、エラーを書いておくと、 ・java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: ・com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: ・com.android.tools.r8.CompilationFailedException: Compilation failed to complete ・com.android.tools.r8.utils.AbortException: Error: Program type already present: com.hoho.android.usbserial.BuildConfig の4つです) いろいろありがとうございました。 よろしくお願いいたします。
guest

0

ボタンを押す前に start_read_thread を含む if (usb != null) { } のブロックは実行されてしまっています.
このブロックを usb = UsbSerialProber.acquire(manager); の後に持っていく必要があるのではないでしょうか.

投稿2019/05/28 07:57

jimbe

総合スコア12545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murakami-kurio

2019/05/29 00:42

ボタンを押したら、usbに値が入るだろう、のつもりでした。 usb = UsbSerialProber.acquire(manager);をonCreate(Bundle savedInstanceState)のちょっと下に救出してみて、if(usb != null){}の外へ持ってきてみました。 状況変わらず、でした。 なにか、わかりましたら、お願いいたします。 必要な情報を得るために、することがあれば教えてください。 よろしくお願いいたします。
jimbe

2019/05/29 02:30

ボタンを押したら `textView.setText("tap!!");` は表示されているでしょうか. C でプログラミングをされているのでしたらデバッグはお出来になると思うのですが...必要な情報は「何処を通ってどの変数がどの値になっているか」です. pic マイコンではどのようにされているのか分かりませんが, java では System.out.println() で変数等表示できますので, 通りそうな箇所にどんどん埋め込んで表示してみては如何でしょう. "tap!!" が表示されていれば usb に値が入るようなコードにはなっていますが, onCreate に直接書かれている if (usb != null) { try { usb.open(); usb.setBaudRate(19200); start_read_thread(); // シリアル通信を読むスレッドを起動 } catch (IOException e) { e.printStackTrace(); } } を通るのはアプリ起動時のみで, その時は usb は null なので if の中は通らず, また, ボタン押下時は通りません. "tap!!" が表示され usb に値が入った後もう一度押下すると, onClick の if (usb != null) { try { usb.write("s".getBytes("UTF-8"), 1); へと進みそうですが, 恐らく `usb.open();` 等を通っていないので usb.write は送信出来ず例外を発して } catch (IOException e) { e.printStackTrace(); を通り, 例外を表示していると思います. が, 想像ですのでその例外の表示を確認しなければ分かりません. また, 「丸写ししたつもりなのですが」ということですが, ボタンによりコードが分断されている等, 元記事のコードが断片であるとはいえ, 『丸写し』にはなっておりません. ボタンを使用せず, なるべく元記事のコードを『丸写し』して書いてみては如何でしょう. > usb = UsbSerialProber.acquire(manager);をonCreate(Bundle savedInstanceState)のちょっと下に救出してみて、if(usb != null){}の外へ持ってきてみました。 具体的にどのようにされたのか, 該当箇所をコピペするなどしてください. 極力お互いの認識に差が無いようにしなければ, 最悪お話が通じなくなります. 元記事には見当たりませんが, android はバージョンによってはシステムに機能を使用する旨を知らせる文をマニフェストに記述する必要があります. API19 でどうなのか調べていませんが, <uses-permission android:name="android.permission.MANAGE_USB" /> が必要かもしれません.
murakami-kurio

2019/05/29 02:57

ああごめんなさい。こっちの回答を見ずに投稿してしまいました。これから読みます。
murakami-kurio

2019/05/29 04:03

午前中、プロジェクトを新しく起こして「丸写し」をしていたのですが、 いろいろ余計なことやってますね。 すみません。 これから、「丸写し」をもういっぺんやってみたいと思います。 <uses-permission android:name="android.permission.MANAGE_USB" /> もその後に試して見ます。 Tap!は表示されます。 Android(Q88)のadbがないので、System.out.println()は使えないと思っていますが、違います? 例外のときは、Android端末の画面にメッセージが出るんですよね? (nullポインターのときは出た) だとすると、例外は起きていません。(ポップアップ表示はない) 変更した箇所ですが、 ```java UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); usb = UsbSerialProber.acquire(manager); ``` の2行を、 ```java ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); usb = UsbSerialProber.acquire(manager); // http://shokai.org/blog/archives/6962 if (usb != null) { try { usb.open(); ... ``` と、移動しました。 変なこといってたらごめんなさい。 よろしくお願いいたします。
jimbe

2019/05/29 04:20

>Android(Q88)のadbがないので、System.out.println()は使えないと思っていますが、違います? あぁ, リリースを作ってインストールして...を繰り返す形で試していらっしゃるのでしたね. アプリの画面のみで確認するとしましたら, 画面のレイアウトにログ用に TextView を作ってそこに随時文字列を追加していく形でしょうか. ですがこれはこれでコーディングに多少慣れが必要ではありますので... 例外が全てandroidの画面にきちんと表示されるとは限りません. 通常例外の発生はプログラムで対処するものですので, システムまで伝播するということは言わばバグに近いことです. 一つの例外の発生により別の例外が発生して…ということも十分ありますので, システムからの表示だけで原因を特定することも大抵は困難です. やはり丸写し...といいますか, ステップ実行を地で行くように, 極力小さい, アプリを起動したら即デバイスに何か変化が起きるというレベルから機能を少しずつ追加していかれたほうが良さそうに思います.
jimbe

2019/05/29 04:27

変更箇所につきましては, 想像通りでした. ありがとうございます. この変更によりまして, アプリ起動時に `if(usb != null) {` を通って usb.open 等を実行するはずになります. するとボタンを押したときも usb.write を通ってくれそうですが...その辺りで変数がどうなっているか確認する方法をやはり考えないといけないですね.
murakami-kurio

2019/05/29 08:30

コメントいただき、ありがとうございます。 また、更新を見逃して質問のほうを編集してました。 2019/05/29 13:20以降の内容は、明日、確認します。 よろしくお願いいたします。
murakami-kurio

2019/05/29 08:31

usb-serial-for-androidを使わないでやろうかなぁ、と、 ちょっと思っています。
jimbe

2019/05/29 09:19

応答につきましては, どのようなタイミングで書かれても問題ありません. こちらも時間があるときにしか出来ませんので^^; ライブラリが変わりましても, やはり adb が使えませんとなかなか大変なのではないでしょうか.
murakami-kurio

2019/05/30 07:25

>...の中ではどこが出来ないでしょうか. Q88のadbドライバがネットで見つけられませんでした。 (Windowsなので必要らしい) 自宅がMacなので、WiFi adbをオンにすれば、 つながるような気もするのですが...まだ、試していません。 Android の USBホスト機能だけで、やっている方々が いらっしゃるのですがadbがないと、ですか...。 (トライしていますが、なかなかビルドが通らない...) また何かありましたら、ご指摘ください。 よろしくお願いいたします。
jimbe

2019/05/30 08:21

> Android の USBホスト機能だけでやっている方々がいらっしゃるのですが android や java を普段からご利用されている方々ではないでしょうか. > AndroidもJavaも初挑戦 となりますと, 内部動作等の想像が付き難いかと思いますので, 動作を追える環境があったほうが良いのではと思います.
murakami-kurio

2019/06/04 08:19

ADB、デバイスドライバでうまく認識しました。(パスがうまく通せなくて、再起動したら、Android Studioが立ち上がらない...(><)。) どうもありがとうございました。
murakami-kurio

2019/06/04 08:24

パス、通りました。すみません。
murakami-kurio

2019/06/05 06:38 編集

kamikaze.cappaさんのご助言で、作ったapkファイルをadbよりインストールしようとしたところ、認識されず、 (>adb devices -l で確認した) adb install usbSerialExamples-debug.apk できませんでした。 今確認したところ、ディバイスドライバーに表示が現れません。 (先ほどはUSBメモリっぽい動きをしていましたが、それもなくなった) 昨日はそれっぽい名前で出ていたのですが...。 .ini ファイル、 「[Google.NTx86] と [Google.NTamd64] のうち適切なセクションに」 の部分がわからず、適当書いているうちに、インストールされた経緯があったりして、もうちょっとごにょごにょしてみます。
murakami-kurio

2019/06/05 07:00

あ、WindowsNT Intel x86と、amd64か。すみません。 ...とすると、NTx86にするとインストールできない(>_<)
murakami-kurio

2019/06/05 08:26 編集

何回かインストールを試みていたら、 「デバイス用のドライバーソフトウェアが最新であることが確認されました」 と表示されドライバーを変更できなくなってしまいました。 これについて、別質問しました。 https://teratail.com/questions/193292 何かわかりましたら、あわせてお願いいたします。
jimbe

2019/06/05 14:10

「ドライバの更新」でダメでしたら, 一度「ドライバの削除」で消して, Windows の再起動等で極力直前の状態からの影響が出ないようにしてから, 改めて更新しては如何でしょうか.
murakami-kurio

2019/06/06 00:36

別質問、 https://teratail.com/questions/193292 別ユーザ様より、「プログラミングではない」旨、指摘をうけましたので、 質問を取り下げました。 指摘の内容、試してみたいと思います。
murakami-kurio

2019/06/07 05:11 編集

上記の本は、USBのHIDクラスだけを使っている模様で、 追記 そんなことないか。HIDはキーボードのクラスだ。 じゃあ、USBシリアル変換は何かと調べたら、 https://www.a-poc.co.jp/howto/howto_usb_serial_com.html USBクラスはCommunication and CDC ControlおよびCDC-Data。(CDC=CommunicationDeviceClass)。 とのことでした。残念。 追記。 CDC?について、触れられていないのはたしかです。 追記2. UsbDeviceConnectionクラスの模様でした。すみません。
guest

0

ソースを見た感じだとポートの一覧の取得で失敗しているようです。
以下がチップを開発している会社だと思います。

UART Terminal Application
https://www.ftdichip.com/Android.htm

こちらのアプリで動作するか見て下さい。
動けば、ソースもあるので、流用できると思います。

投稿2019/06/07 12:16

kamikaze.cappa

総合スコア558

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murakami-kurio

2019/06/10 02:35

ありがとうございます。 秋月の基板に乗っているのが FT231Xのようですので、 UART Terminal Application 16th July 2013 の Alternatively the apk may be downloaded here for direct installation. をインストールして実行して、つないだところ、 ボーレートなどを設定する表示するポップアップが出ました。 (すぐ消えるので、書き留めていない) 通信テストは、適当なものが今ないので、明日やります。 (もうひとつのほう「USBシリアル」は、リストにあがってこない) ソースは、 Source code is available here で、ダウンロードできました。 android studio 用じゃない様なので、ちょっと格闘してみます。 よろしくお願いいたします。
murakami-kurio

2019/06/12 07:48 編集

Android Studio 3.4.1 でインポートしようとしたところ、 app\javaの下のフォルダーがひとつにまとまらず、 階層になってしまいました。 新規プロジェクトに、ソースを参考にそれらしきコードをコピーして、 何とかビルドまで漕ぎ着けたところ、 Duplicate class android.support.v4.... というエラーが多数出て、 ビルドか通りませんでした。 https://stackoverflow.com/questions/55909804/duplicate-class-android-support-v4-app-inotificationsidechannel-found-in-modules を参考に、gradle.properties に android.enableJetifier=true android.useAndroidX=true を書き加えたところ、ビルドで、Build Outputのところに エラー: パッケージandroid.support.v7.appは存在しません などなど、エラーがたくさんでました。 では、Eclipse(Photon Release (4.8.0))でやってみようと インストールなどして プロジェクトを取り込んだところ、エラーが2つ出て、 いろいろぐぐったんですけど、結局、 ・説明 リソース パス ロケーション 型 ビルド・パスが不完全であるため、プロジェクトはビルドされませんでした。android.content.Context のクラス・ファイルが見つかりません。ビルド・パスを修正してから、このプロジェクトをビルドしてください J2XXHyperTerm 不明 Java 問題 ・説明 リソース パス ロケーション 型 型 android.content.Context を解決できません。必要な .class ファイルから間接的に参照されています J2xxHyperTerm.java /J2XXHyperTerm/src/com/ftdi/j2xx/hyperterm 行 360 Java 問題 というエラー(最初のエラーとあまり変わらない)が出て、 解決しませんでした。 ちなみに、ドライバーは、 usb-serial-for-android-v010.jar ではなく、 android-support-v4.jar と d2xx.jar でした。 お手数かけて申し訳ありませんが、何か糸口があれば教えてください。 よろしくお願いいたします。 (同時に、android.hardware.usb....を直接たたく方法を模索してみます) 追記、 エクリプスのバージョンとエラーの内容(忘れた)を書きました。
murakami-kurio

2019/06/12 07:44

(あ、通信は家にあるマイコンにつなごうと考えていて、持ってくるの忘れている。明日こそ)
kamikaze.cappa

2019/06/12 08:00

インポートではなく、プロジェクトを解凍して既存プロジェクトを開くでも一緒でしょうか?
kamikaze.cappa

2019/06/12 08:30

あっ、失礼しました。 プロジェクトが古いのですね
kamikaze.cappa

2019/06/12 08:35

ハードの定義したxmlを入れ替えれば前回のソースでも動くかも知れません
murakami-kurio

2019/06/13 01:14 編集

ありがとうございます。 android-support-v4.jar と d2xx.jar のドライバーを使って、 質問の「該当のソースコード」を動かすということでしょうか。 ちょっと検討したところ、ライブラリの使い方が異なるっぽいので、 難しそうなのですが...。
kamikaze.cappa

2019/06/13 01:25

``` if (manager.hasPermission(availableDrivers.get(0).getDevice())) { //許可した。コネクトするぞい } else { String s = "return20190607-2"; TextView textView = findViewById(R.id.textView); textView.setText(s); } ``` 上記のソースですが、ドライバーは認識していると思います。 device_filter.xml にチップの情報が足りていないのではと思いました。
murakami-kurio

2019/06/13 02:42

ご指摘ありがとうございます。 <!-- 0x067B / 0x2303: USB serial232c ok --> <usb-device vendor-id="1659" product-id="8963" /> <!-- 0x0403 / 0x6015: FTDI FT231X ok --> <usb-device vendor-id="1027" product-id="24597" /> の記載がありました。 AndroidManifest.xml で、device_filter.xml が <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> と、指定されています。 よろしくお願いいたします。
murakami-kurio

2019/06/13 02:46

FTDI の サンプルプログラム、 UART Terminal Application 16th July 2013 のapkで、PICマイコンとの通信ができました。 (タブレットQ88の問題ではなかった) ご報告まで。
murakami-kurio

2019/06/13 08:18

「android.hardware.usb....を直接たたく方法」をやってみているのですが、 スレッドを作ると、 Unfortunately <application> has stopped が起きてしまいます。 別質問として、 https://teratail.com/questions/194793 としました。 よろしければあわせてご回答、お願いいたします。
guest

0

自己解決

Fab蔵さんの201. USB Host事前準備から始まるWebサイトを参考にさせていただき、
ほぼ、そのままで送受信ができました。

j2xxを使っています。

みなさま、いろいろありがとうございました。
###追記(2019.Aug.29)
大量に(あるいは高速に)データを受け取ると、
Handlerまでデータが届かない、という症状が出ております。
readDataまで、データは来ているようなのですが...。
タイマーを追加し、マイコンの手法で読んでみたいと思います。

追記、ここまで。

###追記(2019.July.25)
受信が安定しないようなので、次のように変えました。
オープン・リード・ライト・クローズで見るAndroid FTDI公式 ドライバ

java

1ftDev.read(readData, iavailable); 2// String mData = new String(readData); 3// cannot use System.arraycopy 4for(i=0; i<iavailable; i++) { 5 readDataToText[i] = (char)readData[i]; 6} 7Message msg = mHandler.obtainMessage(); 8// msg.obj = mData; 9msg.obj = String.copyValueOf(readDataToText,0,iavailable); 10mHandler.sendMessage(msg);

追記ここまで。

MainActivity.java

java

1package xx.xx.xxxx.myusbhost; 2 3import android.support.v7.app.AppCompatActivity; 4import android.os.Bundle; 5import android.content.BroadcastReceiver; 6import android.content.Context; 7import android.content.Intent; 8import android.hardware.usb.UsbManager; 9import android.os.Bundle; 10import android.os.Handler; 11import android.os.Message; 12import android.util.Log; 13import android.view.Menu; 14import android.view.MenuItem; 15import android.view.View; 16import android.widget.Button; 17import android.widget.TextView; 18import android.widget.Toast; 19 20import com.ftdi.j2xx.D2xxManager; 21import com.ftdi.j2xx.FT_Device; 22 23public class MainActivity extends AppCompatActivity { 24 25 private FT_Device ftDev = null; 26 private static Context mContext; 27 private D2xxManager ftdid2xx; 28 private static final String TAG = "USB"; 29 private boolean isReading = false; 30 private ReadThread mReadThread; 31 private int iavailable = 0; 32 private static final int readLength = 512; 33 byte[] readData; 34 char[] readDataToText; 35 private TextView mInputValue; 36 private Button mOutputButton; 37 int myCounter = 0; 38 39 @Override 40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 setContentView(R.layout.activity_main); 43 44 try { 45 ftdid2xx = D2xxManager.getInstance(this); 46 } catch (D2xxManager.D2xxException ex) { 47 Log.e(TAG,ex.toString()); 48 } 49 50 mContext = this.getBaseContext(); 51 52 openUsb(); 53 54 mInputValue = (TextView)findViewById(R.id.inputValue); 55 56 // ボタンが押されたらUSBに値を送り込む 57 mOutputButton = (Button)findViewById(R.id.outputButton); 58 mOutputButton.setOnClickListener(new View.OnClickListener() { 59 @Override 60 public void onClick(View v) { 61 myCounter++; 62 //String s = String.valueOf(myCounter); 63 //s += "\r"; 64 String s = "s\r"; 65 SendMessage(s); 66 } 67 }); 68 } 69 70 71 public void openUsb(){ 72 int devCount = 0; 73 devCount = ftdid2xx.createDeviceInfoList(this); 74 if (devCount <= 0) 75 { 76 Toast.makeText(this, "デバイスが発見できません。" + Integer.toString(devCount), Toast.LENGTH_LONG).show(); 77 Log.i(TAG,"デバイスが発見できましせんでした。"); 78 return; 79 } 80 else{ 81 Toast.makeText(this, "" + devCount + "個のデバイスを発見しました。", Toast.LENGTH_LONG).show(); 82 Log.i(TAG,"" + devCount + "個のデバイスを発見しました。"); 83 } 84 85 if(null == ftDev) 86 { 87 ftDev = ftdid2xx.openByIndex(mContext, 0); 88 } 89 else 90 { 91 synchronized(ftDev) 92 { 93 ftDev = ftdid2xx.openByIndex(mContext, 0); 94 } 95 } 96 //ftDev.setBitMode((byte) 0, D2xxManager.FT_BITMODE_RESET); 97 ftDev.setBaudRate(19200); 98 ftDev.setDataCharacteristics(D2xxManager.FT_DATA_BITS_8, D2xxManager.FT_STOP_BITS_1, D2xxManager.FT_PARITY_NONE); 99 ftDev.setFlowControl(D2xxManager.FT_FLOW_NONE, (byte) 0x0b, (byte) 0x0d); 100 ftDev.purge((byte) (D2xxManager.FT_PURGE_TX | D2xxManager.FT_PURGE_RX)); 101 ftDev.restartInTask(); 102 103 readData = new byte[readLength]; 104 readDataToText = new char[readLength]; 105 mReadThread = new ReadThread(mHandler); 106 mReadThread.start(); 107 isReading = true; 108 } 109 110/* 20190703 111*/ 112 public void SendMessage(String msg) { 113 114 if(ftDev == null){ 115 return; 116 } 117 118 synchronized (ftDev) { 119 if (ftDev.isOpen() == false) { 120 Log.e("j2xx", "SendMessage: device not open"); 121 return; 122 } 123 124 ftDev.setLatencyTimer((byte) 16); 125 126 if (msg != null) { 127 byte[] OutData = msg.getBytes(); 128 ftDev.write(OutData, msg.length()); 129 } 130 } 131 } 132 private class ReadThread extends Thread 133 { 134 Handler mHandler; 135 136 ReadThread(Handler h){ 137 mHandler = h; 138 this.setPriority(Thread.MIN_PRIORITY); 139 } 140 141 @Override 142 public void run() 143 { 144 int i; 145 146 while(true == isReading) 147 { 148 try { 149 Thread.sleep(50); 150 } catch (InterruptedException e) { 151 } 152 153 synchronized(ftDev) 154 { 155 iavailable = ftDev.getQueueStatus(); 156 if (iavailable > 0) { 157 158 if(iavailable > readLength){ 159 iavailable = readLength; 160 } 161 162 ftDev.read(readData, iavailable); 163 String mData = new String(readData); 164 Message msg = mHandler.obtainMessage(); 165 msg.obj = mData; 166 mHandler.sendMessage(msg); 167 } 168 } 169 } 170 } 171 172 } 173 174 /** 175 * 描画処理はHandlerでおこなう 176 */ 177 Handler mHandler = new Handler() { 178 @Override 179 public void handleMessage(Message msg) { 180 String mData = (String)msg.obj; 181 mInputValue.setText(mData); 182 } 183 }; 184 185 BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 186 public void onReceive(Context context, Intent intent) { 187 String action = intent.getAction(); 188 if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { 189 // never come here(when attached, go to onNewIntent) 190 openUsb(); 191 } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { 192 if(ftDev != null) { 193 ftDev.close(); 194 isReading = false; 195 } 196 } 197 } 198 }; 199} 200

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <TextView 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:text="Hello World!" 13 app:layout_constraintBottom_toBottomOf="parent" 14 app:layout_constraintLeft_toLeftOf="parent" 15 app:layout_constraintRight_toRightOf="parent" 16 app:layout_constraintTop_toTopOf="parent" /> 17 18 19 <TextView 20 android:id="@+id/inputValue" 21 android:layout_width="fill_parent" 22 android:layout_height="wrap_content" 23 android:layout_marginStart="5dp" 24 android:layout_marginTop="5dp" 25 android:layout_marginEnd="5dp" 26 app:layout_constraintBottom_toTopOf="@+id/outputButton" 27 app:layout_constraintEnd_toEndOf="parent" 28 app:layout_constraintStart_toStartOf="parent" 29 app:layout_constraintTop_toTopOf="parent" /> 30 31 <Button 32 android:id="@+id/outputButton" 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:layout_gravity="center_horizontal" 36 android:layout_marginStart="100dp" 37 android:layout_marginTop="200dp" 38 android:layout_marginBottom="483dp" 39 android:text="Button" 40 app:layout_constraintBottom_toBottomOf="parent" 41 app:layout_constraintEnd_toStartOf="@+id/inputValue" 42 app:layout_constraintStart_toStartOf="parent" 43 app:layout_constraintTop_toTopOf="parent" /> 44 45 46</android.support.constraint.ConstraintLayout>

AndroidManifest.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="xx.xx.xxxx.myusbhost"> 4 5<application 6android:allowBackup="true" 7android:icon="@mipmap/ic_launcher" 8android:label="@string/app_name" 9android:roundIcon="@mipmap/ic_launcher_round" 10android:supportsRtl="true" 11android:theme="@style/AppTheme"> 12<activity android:name=".MainActivity"> 13<intent-filter> 14<action android:name="android.intent.action.MAIN" /> 15<action android:name="android.intent.action.VIEW"/> 16 17<category android:name="android.intent.category.LAUNCHER" /> 18</intent-filter> 19<intent-filter> 20<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 21</intent-filter> 22 23<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 24 android:resource="@xml/device_filter" /> 25 26</activity> 27</application> 28 29</manifest>

device_filter.xml
は、質問と同じ。

投稿2019/07/08 07:08

編集2019/08/29 04:20
murakami-kurio

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/07/08 12:08

お疲れ様でした(_ _
murakami-kurio

2019/07/09 00:44 編集

いろいろありがとうございました。 ...「Q」ではありません(^^;;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問