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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1268閲覧

SoundPoolの再生と停止を異なるActivityで実行する

kakashi55

総合スコア25

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/10/10 12:32

〇やりたいこと
SoundPoolの再生と停止を異なるActivityファイルで実行したいです

詳細
1.MainActivityでSoundPoolの初期化を行い、音楽を再生する
2.音楽再生と同時にintentでAlarmActivityに画面を移動する
3. AlarmActivityでSoundPoolの音楽を停止する

〇困っていること
上記3で、AlarmActivity画面でSoundPoolを呼び出したいが、呼び出し方が分からず困っております。
(SoundPoolを呼び出すために初期化すると、停止ができないです)

コードは冗長なため一部分のみ書きました。

MainActiviy

1class MainActivity : FragmentActivity(), TimePickerDialog.OnTimeSetListener { 2 3 private lateinit var binding: ActivityMainBinding 4 private lateinit var soundManager: SoundManager 5 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 binding = ActivityMainBinding.inflate(layoutInflater) 9 setContentView(binding.root) 10 11 soundManager = SoundManager(this) //初期化 12 13 binding.btnTest.setOnClickListener { 14 alarmSet() 15 } 16 } 17 18  fun alarmSet(){ 19 soundManager.playOne() 20 val intentA = Intent(this, AlarmActivity::class.java) 21 startActivity(intentA) 22 } 23}

AlarmActivity

1class AlarmActivity : AppCompatActivity() { 2 3 private lateinit var binding: ActivityAlarmBinding 4 private lateinit var soundManager: SoundManager //NG 5 6 override fun onCreate(savedInstanceState: Bundle?) { 7 super.onCreate(savedInstanceState) 8 binding = ActivityAlarmBinding.inflate(layoutInflater) 9 setContentView(binding.root) 10 11 soundManager = SoundManager(this) //初期化? 12 13 binding.btnStop.setOnClickListener{ //アラームを止める 14 soundManager.cancelOne() 15 } 16 } 17}

SoundManager

1class SoundManager(context: Context) { 2 3 private var soundPool: SoundPool 4 private var soundOne = 0 5 private var streamId2 = 0 6 7 init { 8 //soundPool設定 9 val audioAttributes = AudioAttributes.Builder() 10 .setUsage(AudioAttributes.USAGE_GAME) 11 .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) 12 .build() 13 14 soundPool = SoundPool.Builder() 15 .setAudioAttributes(audioAttributes) 16 .setMaxStreams(1) 17 .build() 18 19 soundOne = soundPool.load(context, R.raw.bellsound, 1) 20 Log.d("debug", "SoundManager init") 21 } 22 23 fun playOne() { 24 cancelOne() 25 streamId2 = soundPool.play(soundOne, 1.0f, 1.0f, 0, -1, 1.0f) 26 } 27 28 fun cancelOne() { 29 if(streamId2 != 0) { //fun playOneを通るとここを通る(音が鳴るとstreamId2= 1 が入る) 30 soundPool.stop(streamId2) 31 streamId2 = 0 32 } 33 } 34}

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

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

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

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

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

hoshi-takanori

2021/10/11 12:27

SoundManager をシングルトンにすれば良いのでは。
kakashi55

2021/10/12 13:50

ご返答ありがとうございます。 シングルトンを調べたところ、確かにこれで解決できそうです。 ただし、いろいろとコードを直してみたものの解決には至っておりません。 今回の場合はSoundManagerをどのようにシングルトンにすればよいのかご教授いただけないでしょうか。 宜しくお願い致します。
jimbe

2021/10/12 18:53

なぜ再生後アクティビティを移動する仕様なのでしょう。 画面内容が変わるだけであれば、Fragment を変えるだけで済むと思うのですが。
kakashi55

2021/10/13 12:56

jimbe様 コメントありがとうございます。 確かにおっしゃる通りFragmentだけでも対応できそうですので、Fragmentで修正しようかなと思います。
guest

回答1

0

ベストアンサー

SoundManager をシングルトンにすれば良いと思います。
参考: [備忘録]Kotlinでシングルトンクラスの作成方法 - Qiita

  • インスタンスの取得は SoundManager.getInstance(this) とする
  • SoundManager を勝手に生成されないように、コンストラクタを private にする
  • companion object の instance に唯一のインスタンスを格納する
  • Activity のリークを防ぐため、コンストラクタには applicationContext を渡す

diff

1- soundManager = SoundManager(this) //初期化? 2+ soundManager = SoundManager.getInstance(this)

kotlin

1class SoundManager private constructor(context: Context) { 2 3 companion object { 4 private var instance: SoundManager? = null 5 6 fun getInstance(context: Context): SoundManager { 7 if (instance == null) { 8 instance = SoundManager(context.applicationContext) 9 } 10 return instance!! 11 } 12 } 13 14 // あとは元のコードをそのまま 15}

getInstance はこんな書き方もできます。

kotlin

1 fun getInstance(context: Context): SoundManager = 2 instance ?: SoundManager(context.applicationContext).also { instance = it }

投稿2021/10/13 08:26

hoshi-takanori

総合スコア7901

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

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

kakashi55

2021/10/13 12:55

ご丁寧にご説明頂きありがとうございます。無事解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問