Android CameraX SMBにてNAS接続2
見ていられないと思ったのか横を向いちゃった柴犬です。
概要
Android CameraX SMBにてNAS接続1 でのAndroid ファイルをエミュレートで動かしてみました。
警告とエラーが出ました。ああ~。
上の警告は build.gradle.kts (:app) における依存関係の中の implementation(files(“libs/slf4j-api-2.0.11.jar”)) が原因と思われます。
下のエラーはキャストできなかったというエラーです。
警告について
次のURLを見ろとありますが、私の知識では何を言っているのか分かりませんでした。
https://www.slf4j.org/codes.html#noProviders
WEBでいろいろ当たってみたところ次のようにするといいらしいです。
implementation(files("libs/slf4j-api-2.0.11.jar"))
↓
implementation("org.slf4j:slf4j-api:1.8.0-beta2")
runtimeOnly("org.jlib:jlib-awslambda-logback:1.0.0")
エラーについて
MainActivity.kt の中の関数 NasAccess が原因と思われます。
関数の中の次の行の処理は
Log.d("ServerFileAccess", sf.server)
Log.d("ServerFileAccess", sf.share)
Log.d("ServerFileAccess", sf.name)
Log.d("ServerFileAccess", sf.path)
想定した情報を出力しています。
192.168.□□.□□
photo
□□□□□□□□□□□□□□□□□/
mb://192.168.□□.□□/□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□/
ですので、次の if ブロックがおかしい。その中で sf.exists() がエラーの原因と考えられます。
if (sf.exists()) {
Log.d("ServerFileAccess", "ファイル有")
} else {
Log.d("ServerFileAccess", "ファイル無")
}
jcifs-ng-2.1.10.jar のバージョン変更
最新バージョンではなく少し前のバージョンを試します。
MNV Repository のHPから使用状況が一番多い 2.1.7 を選んでダウンロードしました。
WEBトップ
https://mvnrepository.com/artifact/eu.agno3.jcifs/jcifs-ng
jcifs-ng-2.1.7.jarのダウロード先
https://repo1.maven.org/maven2/eu/agno3/jcifs/jcifs-ng/2.1.7/
依存関係が設定できたら AndroidStudio のエミュレータで実行してみます。
修正後の実行
警告、エラーとも発生しなくなりました。
自宅の NAS とも接続できターゲットのフォルダーの中にファイルがあるか否かの確認ができました。
現在最終の依存関係
現在最終の依存関係のコードを記載します。
dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") implementation("androidx.constraintlayout:constraintlayout:2.1.4") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") // SMB implementation(files("libs/bcprov-jdk15on-1.70.jar")) //implementation(files("libs/slf4j-api-2.0.11.jar")) implementation("org.slf4j:slf4j-api:1.8.0-beta2") runtimeOnly("org.jlib:jlib-awslambda-logback:1.0.0") //https://mvnrepository.com/artifact/eu.agno3.jcifs/jcifs-ng/2.1.7 //implementation(files("libs/jcifs-ng-2.1.10.jar")) implementation(files("libs/jcifs-ng-2.1.7.jar")) // コルーチン val kotlin_version = "1.3.9" implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${kotlin_version}") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:${kotlin_version}") //implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0-RC2") val lifecycle_version = "2.7.0" implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:${lifecycle_version}") implementation("androidx.lifecycle:lifecycle-runtime-ktx:${lifecycle_version}") }
現在最終のMainActivity.kt
エラーが原因で確かめるため少しいじりましたので載せます。
package siba.inu.android.sibainuspp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.Button import kotlinx.coroutines.* import java.util.Properties import jcifs.context.BaseContext import jcifs.smb.NtlmPasswordAuthenticator import jcifs.smb.SmbFile class MainActivity : AppCompatActivity() { // コルーチン関連 private val sibainujob = Job() private val sibainuscope = CoroutineScope(Dispatchers.Default + sibainujob) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) initstart() } private fun initstart() { findViewById<Button>(R.id.button).setOnClickListener() { // 非同期処理 sibainuscope.launch { NasAccess("user", "password", "domain", "smbroot") } } } override fun onDestroy() { sibainujob.cancel() super.onDestroy() } private fun NasAccess(user: String, password: String, domain: String, smbroot: String) { var prop = Properties() prop.setProperty("jcifs.smb.client.minVersion", "SMB202") prop.setProperty("jcifs.smb.client.maxVersion", "SMB311") var bc = BaseContext(jcifs.config.PropertyConfiguration(prop)) var auth = NtlmPasswordAuthenticator(domain, user, password) var cifsCon = bc.withCredentials(auth) try { var sf = SmbFile(smbroot, cifsCon) Log.d("ServerFileAccess", sf.server) Log.d("ServerFileAccess", sf.share) Log.d("ServerFileAccess", sf.name) Log.d("ServerFileAccess", sf.path) if (sf.exists()) { // ←←←←←ここでエラー Log.d("ServerFileAccess", "ファイル有") } else { Log.d("ServerFileAccess", "ファイル無") } }catch (ex: Exception) { Log.d("ServerFileAccess", ex.toString()) } finally { Log.d("ServerFileAccess", "finally") } } }
現在最終のAndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- uses-permission android:name="android.permission.ADD_SYSTEM_SERVICE"/ --> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Sibainuspp" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
追記:NASに接続してファイル一覧を表示
黄色の行が、何のことを言っているのか、ちゃんと取得できるのか気になって実行することにしました。
MainActivity.kt の中の NasAccess() 関数のこの部分を
if (sf.exists()) { // ←←←←←ここでエラー
Log.d("ServerFileAccess", "ファイル有")
} else {
Log.d("ServerFileAccess", "ファイル無")
}
次のようにコードを加えて実行してみました。
黄色の行が何の意味なのかまだ分かりませんが、取得できているようです。
if (sf.exists()) { // ←←←←←ここでエラー Log.d("ServerFileAccess", "ファイル有") val filenames: Array<String> = sf.list() for (i in filenames.indices) { Log.d("ServerFileAccess",filenames[i]) } } else { Log.d("ServerFileAccess", "ファイル無") }
前回で終わったと思いましたが甘かったです。今回はこれで終わります。