質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

samba

Samba(サンバ)とは、UNIX系OSにおいてSMBを用いたサービスを提供するためのソフトウェアです。ネットワークを通じて、ファイル共有及びプリンタ共有などのサービスをWindowsマシンへと提供します。ライセンス体系GPLに基づきフリーソフトウェアとして公開されています。

Q&A

1回答

2488閲覧

Android開発 Sambaサーバーの音声ファイルを再生するコードは?

rasum

総合スコア21

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

samba

Samba(サンバ)とは、UNIX系OSにおいてSMBを用いたサービスを提供するためのソフトウェアです。ネットワークを通じて、ファイル共有及びプリンタ共有などのサービスをWindowsマシンへと提供します。ライセンス体系GPLに基づきフリーソフトウェアとして公開されています。

0グッド

0クリップ

投稿2021/08/10 02:57

編集2021/08/10 03:39

Sambaサーバー内の音声ファイルをAndroid端末で再生する方法をお教えください。
jcifs-ngとcoroutineを使って下記コードを書きましたが動きません。

(質問)
・Sambaサーバー内の音声ファイルをAndroid端末で再生するコードはどんな手法が適切でしょうか?(SambaサーバーはLinuxです。Samba以外でもかまいません)
・jcifs-ngとcoroutineを使った下記コードでよいとすれば、非同期スレッドからメインスレッドには何を渡せばよいでしょうか?
・MediaPlayerのsetDataSource( )の引数には何を入れればよいでしょうか?

コード

kotlin

1import android.media.MediaPlayer 2import android.net.Uri 3import androidx.appcompat.app.AppCompatActivity 4import android.os.Bundle 5import android.util.Log 6import jcifs.CIFSContext 7import jcifs.config.PropertyConfiguration 8import jcifs.context.BaseContext 9import jcifs.smb.NtlmPasswordAuthentication 10import jcifs.smb.SmbFile 11import kotlinx.coroutines.* 12import java.io.File 13import java.util.* 14import kotlin.coroutines.CoroutineContext 15 16class MainActivity : AppCompatActivity(), CoroutineScope { 17 ////////////////////////////////////////////// 18 // Please replace these values to your data // 19 val domain: String = "192.168.1.1" 20 val smbroot: String = "/audio/sample.mp3" 21 val user: String = "USER" 22 val password: String = "PASS" 23 ////////////////////////////////////////////// 24 25 private val TAG: String = "MySMB" 26 private val myPlayer: MediaPlayer = MediaPlayer() 27 28 // coroutine準備 29 private val job = Job() 30 override val coroutineContext: CoroutineContext 31 get() = Dispatchers.Main + job 32 33 // 終了時のcoroutineのキャンセル設定、MediaPlayerの破棄 34 override fun onDestroy() { 35 job.cancel() 36 if (myPlayer != null) { 37 myPlayer.reset() 38 myPlayer.release() 39 } 40 super.onDestroy() 41 } 42 43 44 private fun audioStop(){ 45 myPlayer?.run { 46 stop() 47 reset() 48 release() 49 finishAndRemoveTask() 50 } 51 } 52 53 54 override fun onCreate(savedInstanceState: Bundle?) { 55 super.onCreate(savedInstanceState) 56 setContentView(R.layout.activity_main) 57 58 myPlayer?.setOnCompletionListener { mp -> audioStop() } 59 60 61 // smbアクセス処理はActivityとは別スレッドとする必要があるのでcoroutineを利用する 62 launch { 63 val smbUrl = "smb://" + domain + smbroot 64 var smbPaths: String = "" 65 val deferred = async(Dispatchers.IO) { 66 val prop = Properties() // java.util.Properties 67 prop.setProperty("jcifs.smb.client.minVersion", "SMB202") 68 prop.setProperty("jcifs.smb.client.maxVersion", "SMB300") 69 val bc = BaseContext(PropertyConfiguration(prop)) 70 val creds = NtlmPasswordAuthentication(bc, domain, user, password) 71 val auth: CIFSContext = bc.withCredentials(creds) 72 val smb = SmbFile(smbUrl, auth) 73 if (!smb.exists()){ 74 System.exit(1) 75 } 76 77 // smbファイルの確認 78 if (!smb.isFile){ 79 Log.d(TAG,"No file") 80 System.exit(1) 81 } 82 Log.d(TAG,smb.path) 83 Log.d(TAG,smb.length().toString() + "bytes") 84 85 // return to main thread 86 Uri.fromFile(File(smb.path)) 87 } 88 withContext(Dispatchers.Main) { 89 val smbUri = deferred.await() 90 91 myPlayer.setDataSource(this@MainActivity,smbUri) 92 myPlayer.prepare() 93 myPlayer.start() 94 } 95 } 96 97 }

エラーメッセージ

W/System: A resource failed to call close. A resource failed to call close. D/InputTransport: Input channel constructed: '10dc9da', fd=77 I/ViewRootImpl@d660cae[MainActivity]: setView = com.android.internal.policy.DecorView@76c0c14 TM=true I/ViewRootImpl@d660cae[MainActivity]: stopped(true) old=false I/SurfaceControl: assignNativeObject: nativeObject = 0 Surface(name=null)/@0x6805de7 / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1810 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 I/SurfaceControl: assignNativeObject: nativeObject = 0 Surface(name=null)/@0x8ee8d94 / android.view.SurfaceControl.readFromParcel:1117 android.view.IWindowSession$Stub$Proxy.relayout:1820 android.view.ViewRootImpl.relayoutWindow:9005 android.view.ViewRootImpl.performTraversals:3360 android.view.ViewRootImpl.doTraversal:2618 android.view.ViewRootImpl$TraversalRunnable.run:9971 android.view.Choreographer$CallbackRecord.run:1010 android.view.Choreographer.doCallbacks:809 android.view.Choreographer.doFrame:744 android.view.Choreographer$FrameDisplayEventReceiver.run:995 I/ViewRootImpl@d660cae[MainActivity]: Relayout returned: old=(0,0,720,1560) new=(0,0,720,1560) req=(0,0)8 dur=24 res=0x1 s={false 0} ch=false fn=-1 D/MySMB: smb://192.168.1.1/audio/sample.mp3 D/MySMB: 77084518bytes V/MediaPlayerNative: setVideoSurfaceTexture V/MediaPlayerNative: prepare V/MediaPlayerNative: message received msg=100, ext1=1, ext2=-2147483648 E/MediaPlayerNative: error (1, -2147483648) V/MediaPlayerNative: signal application thread V/MediaPlayerNative: prepare complete - status=1 E/AndroidRuntime: FATAL EXCEPTION: main Process: PACKAGE.MY.playaudiolan, PID: 4629 java.io.IOException: Prepare failed.: status=0x1 at android.media.MediaPlayer._prepare(Native Method) at android.media.MediaPlayer.prepare(MediaPlayer.java:1437) at PACKAGE.MY.playaudiolan.MainActivity$onCreate$2$1.invokeSuspend(MainActivity.kt:102) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8571) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) I/Process: Sending signal. PID: 4629 SIG: 9

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="PACKAGE.MY.playaudiolan"> <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"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.PlayAudioLanSimple"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己レスです。
「SMBサーバーのファイルの再生はMediaPlayerではできず、ExoPlayerを使う」という記事を見かけますが、依然不明です。
下記URL記事のコードで、SMBサーバーのファイルをIntentに渡し、端末にインストールされているアプリ(VLC)を起動させることで再生できました。
https://rasumus.hatenablog.com/entry/2021/09/06/123104?_ga=2.178740966.391037858.1630670378-660196271.1625978788

投稿2021/09/06 08:34

rasum

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問