Android(JAVA)のライブラリ(aar)でUSB接続処理を実装すると権限選択時にアプリが必ず1度クラッシュする。

実現したいこと

  • [アプリクラッシュを回避したい。]

USB接続時に必ず1度クラッシュするがクラッシュ後であれば情報を取得することは可能です。
ですが、クラッシュをそもそもしないようにしたいです。
AndroidManifestの設定か、このライブラリを使用する側で何か設定が必要でしょうか?

前提

ライブラリ(USBLib.aar)を作成し、ライブラリ側でUSB接続を行えるようにしています。
アプリはこのaarを呼び出すとUSB情報を取得できます。

実際のアプリはUnityから動作しますが、Androidで作成した動作確認用のテストアプリもあります。
アプリクラッシュはUnityからでもテストアプリからでも発生します。

ライブラリのAndroidManifestにてUSBの権限を設定するような定義にしています。
intent-filterにて対象の製品IDとベンダーIDを定義しており当該情報のみ動作するようにしています。

[クラッシュ具体例]
テストアプリをAndroid端末実機にUSB経由でインストールし、アプリを起動します。(USBデバッグ有効の状態)
起動中にUSB接続を行うとアプリ選択画面が出てくるため、当該アプリを選択するとクラッシュします。
※1回のみを選択
クラッシュ後、USB接続状態でアプリを再度立ち上げてUSB情報取得ボタンを押下すると、USB情報を正常に取得できます。

USB接続時の選択画面にてアプリを選択しない場合、クラッシュしません。
クラッシュしませんがUSB情報取得ボタンを押しても取得できません。

USBを抜いて、再度接続するとまたアプリ選択画面が出るため、アプリを選択するとクラッシュします。
※常時接続を行うと、アプリ選択画面は出ませんが同じようにUSB接続した場合クラッシュして2回目の起動ではクラッシュしない。

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

AndroidRuntime: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{パッケージ名}: java.lang.ClassCastException: パッケージ名 cannot be cast to android.app.Activity

該当のソースコード

xml

1<!-- androidmanifest -->2<?xml version="1.0" encoding="utf-8"?>3<manifest xmlns:android="http://schemas.android.com/apk/res/android"4 xmlns:tools="http://schemas.android.com/tools"5 package="パッケージ名">6 7 <uses-sdk android:minSdkVersion="12" />8 9 <uses-feature10 android:name="android.hardware.usb.host"11 android:required="false" />12 13 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />14 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> /> 15 16 <application17 android:debuggable="true"18 tools:ignore="HardcodedDebugMode">19 <activity20 android:name=".USBLib"21 android:exported="true"22 tools:ignore="Instantiatable">23 <intent-filter>24 <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />25 </intent-filter>26 27 <meta-data28 android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"29 android:resource="@xml/device_filter" />30 </activity>31 </application>32 33</manifest>

xml

1<!-- device_filter-->2<?xml version="1.0" encoding="utf-8"?>3 4<resources>5 <usb-device vendor-id="id" product-id="pid1"/>6 <usb-device vendor-id="id" product-id="pid2"/>7 <usb-device vendor-id="id" product-id="pid3"/>8 </resources>9

Java

12public class USBLib 3{4 private Context myContext = null;5 6 public USBLib()7 {8 9 }10 11 public int setContext(Context context) {12 myContext = context;13 return 0;14 }15 16 public int setContext() {17 int result = 0;18 if (myContext == null){19 result = setContext(UnityPlayer.currentActivity.getApplicationContext());20 }21 return result;22 }23 24 25 public String GetSts()26 {27 28 UsbManager manager = (UsbManager) myContext.getSystemService(Context.USB_SERVICE);29 HashMap<String, UsbDevice> deviceList = manager.getDeviceList();30 Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();31 while(deviceIterator.hasNext()) {32 UsbDevice device = deviceIterator.next();33 return device.getDeviceName();34 }35 36 return "";37 }38}39

Java

12 3public class MainActivity extends AppCompatActivity implements View.OnClickListener4{5 6 USBLib reader = new USBLib();7 @Override8 protected void onCreate(Bundle savedInstanceState) {9 super.onCreate(savedInstanceState);10 setContentView(R.layout.activity_main);11 12 findViewById(R.id.button).setOnClickListener(this);13 }14 @Override15 public void onClick(View v) {16 17 Context context = this.getApplicationContext();18 String dump = "";19 try {20 21 reader.setContext(context);22 dump = reader.GetSts();23 }24 catch (Exception ex)25 {26 dump = ex.toString();27 }28 }29}

試したこと

ボタン押下時ではないため、関係ないと思いつつも
USB取得処理を無効化しても変わらなかった。

USB選択時であるのでおそらくAndroidManifestの問題?

AndroidManifestの
<activityをServiceにしてみると、アプリ選択ができなかった。

Unityからの呼び出しでも同じ

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

Android Gradle Plugin Version 4.0.2
Gradle Version 6.1.1

gradle(抜粋)

1 compileSdkVersion 34 2 defaultConfig { 3 minSdkVersion 26 4 targetSdkVersion 34 5 versionCode 1 6 versionName "1.0" 7 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 8 consumerProguardFiles "consumer-rules.pro" 9 } 10 11 compileOptions { 12 sourceCompatibility JavaVersion.VERSION_1_8 13 targetCompatibility JavaVersion.VERSION_1_8 14 } 15 16 configurations.implementation { 17 exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8' 18 exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7' 19}

コメントを投稿

0 コメント