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", "ファイル無")
}


前回で終わったと思いましたが甘かったです。今回はこれで終わります。