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

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

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

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

250閲覧

IntentServiceのクラス内でwavを再生する方法

kpfc

総合スコア7

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/04/16 11:12

IntentServiceのクラス内で
soundOne = soundPool.load(this, R.raw.one, 1);
を実行するとアプリが再起動になってしまいます。

oneとはres/raw/one.wavです。
IntentServiceのクラス外では
soundPool.play(soundOne, 1.0f, 1.0f, 0, 0, 1);
で再生できています。

soundOne = soundPool.load(this, R.raw.one, 1);
の記述場所は
onCreate()
onStartCommand()
のどちらも試しました。

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

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

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

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

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

keicha_hrs

2018/04/16 11:37

同じ質問を複数投稿しないでください。一方は運営に削除依頼をしてください。
aja

2018/04/17 03:36

コードを出したほうがいいですね
guest

回答2

0

IntentServiceの特徴は自動で終了してくれるところです。

http://android.keicode.com/basics/services-intentservice.php

ただし、処理が完了したと判断されると勝手にServiceが終了します。
おそらく音楽再生前にServiceが終了しています。

onDestroy() でログを出力してみると良いかもしれません。

対策はいろいろ考えられます。
IntentServiceではなくServiceで管理する。
音を出している間IntentServiceを終了させないようなスレッドを止める等。

投稿2018/04/17 15:07

HanaleiMoon

総合スコア143

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

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

kpfc

2018/04/23 08:06

IntentServiceではなくServiceで管理するもの良い方法ですが今回は IntentServiceに限定したいです。 音楽再生前にServiceが終了していないことは確認できました。 soundOne = soundPool.load(this, R.raw.one, 1); これを soundOne = soundPool.load(this, "/data/user/0/com.example.project1/files/raw/one.wav", 1); のようにRを使わず書いてみたいのですが上記の展開パスはこれで合っていますか? soundPool.load()ではRを使うのは必須なのでしょうか? soundPool.load()のエラーはRではないと思っています。 Android7.1の実機で動作させようとしてsoundPool.load()でエラーになっています。
HanaleiMoon

2018/04/23 10:13

res/raw/内に wav ファイルを配置しているなら R.raw.one とすべきです。 音楽再生前にServiceが終了していないことは確認できたことはわかりました。再生中にもServiceが終了していないでいいですよね? それであれば soundPool.load() が完了していないうちに soundPool.play() をしていませんか? load() が完了したかは OnLoadCompleteListener() でわかります。 この通知より前に play() しても音は出ません。
guest

0

ベストアンサー

アプリが再起動

IntentServiceでSoundPoolの音が出ないだけであれば
ロードされていないうちに再生しようとしているのかもしれませんが
それでも再起動になることはないと思います

one.wavは本当に再生できるものでしょうか

投稿2018/04/17 08:07

aja

総合スコア3733

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

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

kpfc

2018/04/17 08:16 編集

one.wavは再生可能です。 IntentServiceのクラス外でone.wavを再生しました。 また、よくある原因として再生タイミングがロードしてから早過ぎるため といった問題がありますが、今回はその問題とは関係ございません。 と言いますより、現在はロードでエラーになっているので再生の ところまで進めていません。
aja

2018/04/17 08:41

>ロードでエラー コードを出されていないので IntentServiceでどのような設定なのかわからないですが onCreate()などでsuperを設定していないのでは
kpfc

2018/04/17 08:48

IntentServiceのクラスでsuperという文字列は 以下のように2ケ所書いてあります。 @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { soundTestOne(); return super.onStartCommand(intent, flags, startId); }
aja

2018/04/17 12:38

部分的なので全体が分からないですが onCreate(), onStartCommand()は良さげです IntentServiceだけでの動作は大丈夫でしょうか
kpfc

2018/04/23 08:09

IntentServiceだけでの動作は大丈夫でしょうかといいますのは 音楽再生部分をコメントアウトしたらどうかということですね? はい、音楽再生部分をコメントアウトすると動作は大丈夫です。 one.wavは0.1秒のとても小さな音楽ファイルです。
aja

2018/04/23 11:19

それでは、wavファイルのロードに問題があるのではと考えると soundPool.load(this, R.raw.one, 1) のContextをthisで取得していますが、取得できる場所でやっているのでしょうか あるいは取得しようとしているものが正しくないとか
kpfc

2018/04/27 10:16

thisが原因でした。 エラーが全く出なかったのでthisでよいと思い込んでいました。 IntentServiceが原因と関係しているという思い込みのせいでもありました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問