前提・実現したいこと
KotlinにてAndroidからWindowsの共有ファイルにアクセスするアプリを開発しております。
jcifs-ngを使用して、アクセスを試みていますが、ファイル有無確認の処理の段階で異常終了してしまいます。
エラー原因などわかる方がいましたら、ご教示いただけますでしょうか。
このサイトを参考にしています。
発生している問題・エラーメッセージ
05-21 08:10:51.533 4437-4462/xxxxx D/ServerFileAccess: サーバーIP or サーバー名 05-21 08:10:51.533 4437-4462/xxxxx D/ServerFileAccess: 共有名 05-21 08:10:51.533 4437-4462/xxxxx D/ServerFileAccess: ファイル名 05-21 08:10:51.580 4437-4462/xxxxx D/ServerFileAccess: finally 05-21 08:10:51.648 4437-4462/xxxxx E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1 Process: xxxxx , PID: 4437 java.lang.IllegalAccessError: Illegal class access: 'jcifs.spnego.NegTokenInit' attempting to access 'org.bouncycastle.asn1.DEROutputStream' (declaration of 'jcifs.spnego.NegTokenInit' appears in /data/app/xxxxx -1/base.apk) at jcifs.spnego.NegTokenInit.toByteArray(NegTokenInit.java:158) at jcifs.smb.SpnegoContext.initSecContext(SpnegoContext.java:207) at jcifs.smb.SmbSessionImpl.createToken(SmbSessionImpl.java:665) at jcifs.smb.SmbSessionImpl.sessionSetupSMB2(SmbSessionImpl.java:538) at jcifs.smb.SmbSessionImpl.sessionSetup(SmbSessionImpl.java:483) at jcifs.smb.SmbSessionImpl.send(SmbSessionImpl.java:369) at jcifs.smb.SmbSessionImpl.send(SmbSessionImpl.java:347) at jcifs.smb.SmbTreeImpl.treeConnect(SmbTreeImpl.java:611) at jcifs.smb.SmbTreeImpl.send(SmbTreeImpl.java:429) at jcifs.smb.SmbTreeImpl.send(SmbTreeImpl.java:405) at jcifs.smb.SmbTransportImpl.getDfsReferrals(SmbTransportImpl.java:1724) at jcifs.smb.DfsImpl.getDcReferrals(DfsImpl.java:192) at jcifs.smb.DfsImpl.getDc(DfsImpl.java:233) at jcifs.smb.DfsImpl.getTrustedDomains(DfsImpl.java:112) at jcifs.smb.DfsImpl.resolve(DfsImpl.java:352) at jcifs.smb.DfsImpl.resolve(DfsImpl.java:326) at jcifs.smb.SmbTreeConnection.connectHost(SmbTreeConnection.java:530) at jcifs.smb.SmbTreeConnection.connectHost(SmbTreeConnection.java:489) at jcifs.smb.SmbTreeConnection.connect(SmbTreeConnection.java:465) at jcifs.smb.SmbTreeConnection.connectWrapException(SmbTreeConnection.java:426) at jcifs.smb.SmbFile.ensureTreeConnected(SmbFile.java:558) at jcifs.smb.SmbFile.exists(SmbFile.java:852) at xxxxx .MainActivity.ServerFileAccess(MainActivity.kt:100) at xxxxx .MainActivity.access$ServerFileAccess(MainActivity.kt:11) at xxxxx .MainActivity$initSetting$1$1.invokeSuspend(MainActivity.kt:39) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)
該当のソースコード
Kotlin
1class MainActivity : AppCompatActivity() { 2 // コルーチン関連 3 private val mf_job: kotlinx.coroutines.Job = kotlinx.coroutines.SupervisorJob() 4 private val mf_scope = kotlinx.coroutines.CoroutineScope(kotlinx.coroutines.Dispatchers.Default + this.mf_job) 5 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 setContentView(R.layout.activity_main) 9 10 this.initSetting(); 11 } 12 13 // 初期設定 14 private fun initSetting() { 15 // テストボタン 16 this.findViewById<Button>(R.id.button).setOnClickListener() { 17 // 非同期処理 18 this.mf_scope.launch() { 19 ServerFileAccess() 20 } 21 } 22 } 23 24 private fun ServerFileAccess() { 25 //プロパティを準備する 26 var prop: java.util.Properties 27 prop = java.util.Properties() 28 prop.setProperty("jcifs.smb.client.minVersion", "SMB210"); 29 prop.setProperty("jcifs.smb.client.maxVersion", "SMB311"); 30 31 //基本コンテキストを作成する 32 var bc: jcifs.context.BaseContext; 33 bc = jcifs.context.BaseContext(jcifs.config.PropertyConfiguration(prop)) 34 35 // 認証情報を作成する 36 var auth: jcifs.smb.NtlmPasswordAuthenticator 37 auth = jcifs.smb.NtlmPasswordAuthenticator("ドメイン名", "ユーザー名", "パスワード") 38 39 //接続コンテキストを作成する 40 var cifsCon: jcifs.CIFSContext 41 cifsCon = bc.withCredentials(auth) 42 43 // ファイル情報 44 var filePath: String 45 filePath = "smb:\\サーバーIP or サーバー名\共有名\ファイル名" 46 filePath = filePath.replace("\", "/") 47 48 try { 49 var sf: jcifs.smb.SmbFile 50 sf = jcifs.smb.SmbFile(filePath, cifsCon) 51 Log.d("ServerFileAccess", sf.server) 52 Log.d("ServerFileAccess", sf.share) 53 Log.d("ServerFileAccess", sf.name) 54 if(sf.exists()) { // ここでエラー 55 Log.d("ServerFileAccess", "ファイル有") 56 } else { 57 Log.d("ServerFileAccess", "ファイル無") 58 } 59 } catch (ex: Exception) { 60 Log.d("ServerFileAccess", "エラー", ex) // 実行されない 61 } finally { 62 Log.d("ServerFileAccess", "finally") // 実行される 63 } 64 Log.d("ServerFileAccess", "END") // 実行されない 65 } 66}
buildGradle
1 implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 2 implementation 'androidx.core:core-ktx:1.3.2' 3 implementation 'androidx.appcompat:appcompat:1.2.0' 4 implementation 'com.google.android.material:material:1.2.1' 5 implementation 'androidx.constraintlayout:constraintlayout:2.0.4' 6 implementation files('libs\bcprov-jdk15to18-1.68.jar') 7 implementation files('libs\jcifs-ng-2.1.5.jar') 8 implementation files('libs\slf4j-api-1.7.24.jar')
AndroidManifestXml
1 <uses-permission android:name="android.permission.INTERNET"/> 2 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 3 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 4 <uses-permission android:name="android.permission.ADD_SYSTEM_SERVICE"/>
試したこと
仮想デバイス特有のエラーかと思い、実機(API:21)でも試しましたが、同様に異常終了しました。
(ネットワーク接続は確認済み)
Nexus 5X API24の仮想デバイスにて、「cxfile explorer」をインストールし、
Windows共有ファイルにアクセス出来るか試したところ、問題なくアクセス出来ました。
上記サイト記載の「smbj」でも試しましたが、SMBClient宣言時に異常終了しました。
(あまり調査せず)
補足情報(FW/ツールのバージョンなど)
各種バージョン
Android Studio:4.1.2
Kotlin:1.3.72
jcifs-ng:2.1.5
仮想デバイスAPI:21,22,24,30
Windows OS:Windows Server 2012(アクセス先)
エラー原因とは関係ありませんが、異常終了する原因?
情報が不足していましたら、追記させていただきます。
回答1件
あなたの回答
tips
プレビュー