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

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

ただいまの
回答率

90.48%

  • Java

    16124questions

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

  • Android Studio

    4356questions

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

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

受付中

回答 3

投稿 編集

flag 質問者が4日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 294

前提・実現したいこと

普段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 version="1.0" encoding="utf-8"?>
<resources>
    <!-- 0x067B / 0x2303: USB serial232c ok -->
    <usb-device vendor-id="1659" product-id="8963" />

    <!-- 0x067B / 0x2303: USB serial232c -->
    <usb-device vendor-id="1659" product-id="8963" />

    <!-- 0x0403 / 0x6001: FTDI FT232R UART -->
    <usb-device vendor-id="1027" product-id="24577" />

    <!-- 0x0403 / 0x6015: FTDI FT231X ok -->
    <usb-device vendor-id="1027" product-id="24597" />

    <!-- 0x2341 / Arduino -->
    <usb-device vendor-id="9025" />

    <!-- 0x16C0 / 0x0483: Teensyduino  -->
    <usb-device vendor-id="5824" product-id="1155" />

    <!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
    <usb-device vendor-id="4292" product-id="60000" />

    <!-- 0x067B / 0x2303: Prolific PL2303 -->
    <usb-device vendor-id="1659" product-id="8963" />

    <!-- 0x1a86 / 0x7523: Qinheng CH340 -->
    <usb-device vendor-id="6790" product-id="29987" />
</resources>

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

MainActivity.java

package xx.xx.xxxx.helloworld5;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.*;
import android.hardware.usb.*;
import android.util.Log;
import android.widget.TextView;
import com.hoho.android.usbserial.driver.*;

public class MainActivity extends AppCompatActivity {
    UsbSerialDriver usb;
    int counter = 0;
    int counter2 = 0;

    @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);
        if (usb != null) {
            try{
                usb.open();
                usb.setBaudRate(19200);
                start_read_thread(); // シリアル通信を読むスレッドを起動
            }
            catch(IOException e){
                e.printStackTrace();
            }
            counter++;
            String str = String.valueOf(counter);
            TextView my_counter = findViewById(R.id.counter_text);
            my_counter.setText(str);

            while(true) {
                try {
                    usb.write("o".getBytes("UTF-8"), 1);
                } catch (UnsupportedEncodingException e) {
                    // 発生し得ないが、書くしかない
                    // https://qiita.com/niharu/items/662b130149ee180f7f34
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            counter2++;
            String str2 = String.valueOf(counter2);
            TextView my_counter2 = findViewById(R.id.counter_text2);
            my_counter2.setText(str2);
        }
    }
    public void start_read_thread(){
        new Thread(new Runnable(){
            public void run(){
                try{
                    while(true){
                        byte buf[] = new byte[256];
                        int num = usb.read(buf, buf.length);
                        if(num > 0) Log.v("Arduino", new String(buf, 0, num)); // Arduinoから受信した値をlogcat出力
                        Thread.sleep(10);
                    }
                }
                catch(IOException e){
                    e.printStackTrace();
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xx.xx.xxxx.helloworld5">
    <uses-feature android:name="android.hardware.usb.host" />
    <!-- https://blog.integrityworks.co.jp/2017/12/20/permission-is-only-granted-to-system-app/ -->
    <uses-permission android:name="android.permission.MANAGE_USB" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
               <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>
            <meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
        </activity>
    </application>

</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つのシリアル通信を試しました。

古くて情報がないもの。
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
と出ました。

送信ができました。(ご報告)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/05/29 11:18

    > 通信相手をつないでもusbがNULLのまま
    「通信相手をつないで」というイベントに対してアプリが何かするようなコードにはなっておりません.
    通信相手をつないで『アプリの画面の R.id.button ボタンを押しても』usbがNULLのまま, という解釈であっていますでしょうか.

    > シリアルの端末がつながると、スイッチの反応がなくなる
    なんのスイッチでしょう.

    > シリアルの端末がつながると、ポップアップで許可を求めてきます。
    どのような「許可」を求められるのでしょうか

    キャンセル

  • murakami-kurio

    2019/05/29 11: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と判断しています。
    お手間を取らせて申し訳ありませんが、よろしくお願いいたします。

    キャンセル

回答 3

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/29 09:42

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

    キャンセル

  • 2019/05/29 11: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" />
    が必要かもしれません.

    キャンセル

  • 2019/05/29 11:57

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

    キャンセル

  • 2019/05/29 13: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();
    ...
    ```
    と、移動しました。

    変なこといってたらごめんなさい。
    よろしくお願いいたします。

    キャンセル

  • 2019/05/29 13:20

    >Android(Q88)のadbがないので、System.out.println()は使えないと思っていますが、違います?
    あぁ, リリースを作ってインストールして...を繰り返す形で試していらっしゃるのでしたね.
    アプリの画面のみで確認するとしましたら, 画面のレイアウトにログ用に TextView を作ってそこに随時文字列を追加していく形でしょうか. ですがこれはこれでコーディングに多少慣れが必要ではありますので...

    例外が全てandroidの画面にきちんと表示されるとは限りません. 通常例外の発生はプログラムで対処するものですので, システムまで伝播するということは言わばバグに近いことです. 一つの例外の発生により別の例外が発生して…ということも十分ありますので, システムからの表示だけで原因を特定することも大抵は困難です.

    やはり丸写し...といいますか, ステップ実行を地で行くように, 極力小さい, アプリを起動したら即デバイスに何か変化が起きるというレベルから機能を少しずつ追加していかれたほうが良さそうに思います.

    キャンセル

  • 2019/05/29 13:27

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

    キャンセル

  • 2019/05/29 13:31

    adb に関しましては全く詳しくないのですが,
    https://developer.android.com/studio/command-line/adb?hl=JA
    の中ではどこが出来ないでしょうか.

    キャンセル

  • 2019/05/29 17:30

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

    キャンセル

  • 2019/05/29 17:31

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

    キャンセル

  • 2019/05/29 18:19

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

    キャンセル

  • 2019/05/30 16:25

    >...の中ではどこが出来ないでしょうか.
    Q88のadbドライバがネットで見つけられませんでした。
    (Windowsなので必要らしい)
    自宅がMacなので、WiFi adbをオンにすれば、
    つながるような気もするのですが...まだ、試していません。

    Android の USBホスト機能だけで、やっている方々が
    いらっしゃるのですがadbがないと、ですか...。
    (トライしていますが、なかなかビルドが通らない...)

    また何かありましたら、ご指摘ください。
    よろしくお願いいたします。

    キャンセル

  • 2019/05/30 17:06

    ↓このような記事がありました.
    Android用ADBドライバをインストールする方法というか最終手段(Windows向け)
    https://www.teradas.net/archives/8088/

    キャンセル

  • 2019/05/30 17:21

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

    キャンセル

  • 2019/06/04 17:19

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

    キャンセル

  • 2019/06/04 17:24

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

    キャンセル

  • 2019/06/05 15:28 編集

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

    キャンセル

  • 2019/06/05 16:00

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

    キャンセル

  • 2019/06/05 17:25 編集

    何回かインストールを試みていたら、
    「デバイス用のドライバーソフトウェアが最新であることが確認されました」
    と表示されドライバーを変更できなくなってしまいました。

    これについて、別質問しました。
    https://teratail.com/questions/193292

    何かわかりましたら、あわせてお願いいたします。

    キャンセル

  • 2019/06/05 23:10

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

    キャンセル

  • 2019/06/06 09:36

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

    指摘の内容、試してみたいと思います。

    キャンセル

  • 2019/06/06 09:41

    中古で、
    PICで楽しむAndroidアクセサリの自作
    https://www.amazon.co.jp/dp/4774150991/

    を注文しました。今晩届く予定です。

    キャンセル

  • 2019/06/07 13:47 編集

    上記の本は、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クラスの模様でした。すみません。

    キャンセル

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/29 09:34

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

    キャンセル

  • 2019/05/29 11:50

    https://developer.android.com/reference/android/hardware/usb/UsbManager.html#getDeviceList()

    getDeviceList と言うメソッドがあります。
    このメソッドでデバイスの一覧に表示されるか確認した方が良いと思います。

    キャンセル

  • 2019/05/29 13:14

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

    キャンセル

  • 2019/05/30 09:37

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

    キャンセル

  • 2019/05/30 15:03

    http://systemp.hatenablog.com/entry/2013/04/07/184333

    この辺りは大丈夫でしょうか?

    ```
    必要なものは、以下のとおり

    ・USBホスト機能をもっているAndroid端末
     バージョンが3.1以上であればよいかというと、そういう分けでもないようです。
     端末によって、対応してたりしてなかったり。
    ・USBホストケーブル
     ホスト対応したものが、必要なので要注意です。
    ```

    キャンセル

  • 2019/05/30 16:15

    ご指摘いただき、ありがとうございます。
    >USBホスト機能をもっているAndroid端末
    OGTと記載されているものを買いました。

    >USBホストケーブル
    付属のものを使っています。

    USBメモリをつないだところ、ファイルが見られました。

    なにかありましたら、また、教えてください。

    キャンセル

  • 2019/05/30 16:28

    7インチタブレット
    Android 4.4 WIFI機能付き クアッドコアタブレット
    https://www.amazon.co.jp/dp/B07KMQNFXJ/
    です。

    キャンセル

  • 2019/05/30 17: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ダウンロード解凍でもできます。

    キャンセル

  • 2019/05/30 17:16

    OTG(On The Go)ですね.

    キャンセル

  • 2019/06/03 13:20

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

    キャンセル

  • 2019/06/04 17:21

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

    キャンセル

  • 2019/06/04 20: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

    キャンセル

  • 2019/06/05 09:55 編集

    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のインストールがうまく行ってない?とか。)

    キャンセル

  • 2019/06/05 10:19

    こちらを参考にしてみて下さい。

    https://www.javadrive.jp/start/install/index4.html

    キャンセル

  • 2019/06/05 14:12 編集

    ありがとうございます。
    以下のようになりました。パスは通っていると見ていいんですよね?

    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_ があるけど...。(記憶が...)

    キャンセル

  • 2019/06/05 14:24

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

    キャンセル

  • 2019/06/05 15:23

    どうもありがとうございます。
    ターミナルの表示は上記でしたが、
    環境変数のところに、JAVA_HOMEがありませんでした。
    pathもエディターにコピペして検索かけたのですが、
    一致するものはありませんでした。すみません。
    jdk1.8.0_211に統一し、設定しなおしたところ、
    ビルドが通りました。

    ...それでなのですが、インストールして動かしてみたところ、
    USB Serial Example
    1 device(s) found
    Vendor 0403 Product 6015
    と出ました。(秋月のほう)
    うーむ。どうしたらいいでしょうか。よろしくお願いいたします。

    キャンセル

  • 2019/06/05 16:13

    以下の場所にライブラリーが生成されます。
    ./usbSerialForAndroid/build/outputs/aar/usbSerialForAndroid-debug.aar

    libs フォルダーにコピーして使用してください。
    もとあるものは削除したほうがよいかも

    以下の、snippet を参考してアクセス方法を変えてみて下さい。
    https://github.com/mik3y/usb-serial-for-android

    キャンセル

  • 2019/06/05 16:18

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

    キャンセル

  • 2019/06/06 09:57

    紛らわしい書き方をしてすみません。
    秋月のが目的のデバイスですので、認識されています。

    ライブラリとsnippetありがとうございます。
    こちらを使ってやって見ます。

    キャンセル

  • 2019/06/06 14: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から離れます。
    よろしくお願いいたします。

    キャンセル

  • 2019/06/06 15:26

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

    キャンセル

  • 2019/06/06 17: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を
    インストールするようにしました。

    これでなにか、わかりますでしょうか?
    よろしくお願いいたします。

    キャンセル

  • 2019/06/06 17:48

    availableDrivers 値がどうなっているか確認してみて下さい。

    参考URL
    https://techacademy.jp/magazine/2441

    キャンセル

  • 2019/06/07 11: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が表示されました。

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

    キャンセル

  • 2019/06/07 16:33 編集

    新たな質問で申し訳ありません。
    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を代入しているところが見つからないです。

    キャンセル

  • 2019/06/07 16:51

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

    キャンセル

  • 2019/06/07 17:15

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

    キャンセル

  • 2019/06/07 17:21

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

    キャンセル

  • 2019/06/14 17: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 を返すのではないかと思います.

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/10 11: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 用じゃない様なので、ちょっと格闘してみます。

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

    キャンセル

  • 2019/06/12 16:33 編集

    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....を直接たたく方法を模索してみます)

    追記、
    エクリプスのバージョンとエラーの内容(忘れた)を書きました。

    キャンセル

  • 2019/06/12 16:44

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

    キャンセル

  • 2019/06/12 17:00

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

    キャンセル

  • 2019/06/12 17:30

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

    キャンセル

  • 2019/06/12 17:35

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

    キャンセル

  • 2019/06/13 10:13 編集

    ありがとうございます。

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

    キャンセル

  • 2019/06/13 10: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 にチップの情報が足りていないのではと思いました。

    キャンセル

  • 2019/06/13 11: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" />
    と、指定されています。

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

    キャンセル

  • 2019/06/13 11:46

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

    キャンセル

  • 2019/06/13 17:18

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

    キャンセル

同じタグがついた質問を見る

  • Java

    16124questions

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

  • Android Studio

    4356questions

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