実現したいこと
- [アプリクラッシュを回避したい。]
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-feature 10 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 <application 17 android:debuggable="true" 18 tools:ignore="HardcodedDebugMode"> 19 <activity 20 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-data 28 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
1 2public 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
1 2 3public class MainActivity extends AppCompatActivity implements View.OnClickListener 4{ 5 6 USBLib reader = new USBLib(); 7 @Override 8 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 @Override 15 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}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/11/02 06:59
2023/11/02 07:47
2023/11/02 08:14
2023/11/06 01:29
2023/11/06 04:22
2023/11/06 07:32
2023/11/06 07:34
2023/11/06 08:54
2023/11/06 09:07
2023/11/14 01:24