2011-08-16 11 views
0

注:私はちょっとしたことですので、これらのエラーの意味は分かりません。SoundPool型のメソッドload(Context、int、int)は適用されません。メソッドgetSystemService(String)は定義されていません

これは私のクラスのコードです:

package ryan.test; 

import java.util.HashMap; 

import android.content.Context; 
import android.media.AudioManager; 
import android.media.SoundPool; 

public class MySingleton { 

    private MySingleton instance; 

    private static SoundPool mSoundPool; 
    private HashMap<Integer, Integer> soundPoolMap; 

    public static final int A1 = 1; 

    private MySingleton() { 
     mSoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);// Just an example 
     soundPoolMap = new HashMap<Integer, Integer>(); 
     soundPoolMap.put(A1, mSoundPool.load(this, R.raw.a, 1)); 
    // soundPoolMap.put(A5, mSoundPool.load(MyApp.this,  R.raw.a, 1)); 
    } 

    public synchronized MySingleton getInstance() { 
     if(instance == null) { 
      instance = new MySingleton(); 
     } 
     return instance; 
    } 

    public void playSound(int sound) { 
     AudioManager mgr = (AudioManager)MySingleton.getSystemService(Context.AUDIO_SERVICE); 
     float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); 
     float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);  
     float volume = streamVolumeCurrent/streamVolumeMax; 

     mSoundPool.play(soundPoolMap.get(sound), volume, volume, 1, 0, 1f);  
    } 

    public SoundPool getSoundPool() { 
     return mSoundPool; 
    } 
} 

そして、私は2つのエラーを取得し、最初のエラーはここにあるのです:

soundPoolMap.put(A1, mSoundPool.load(this, R.raw.a, 1)); 

とエラーがThe method load(Context, int, int) in the type SoundPool is not applicable for the arguments (MySingleton, int, int) が言うと、2番目のエラーはここにあります:

AudioManager mgr = (AudioManager)MySingleton.getSystemService(Context.AUDIO_SERVICE); 

と表示され、エラーはと表示されます。

答えて

1

これらのメソッドを使用するには、コンテキストが必要です。 getSystemServiceは、コンテキストインスタンスのメソッド、myActivity.getSystemService()です。 load()は、最初の引数としてContextインスタンス(myActivity)を渡すことも想定しています。主なアクティビティ以外のコンテキストへの参照を保持することは推奨されないため、このロジックをアクティビティに戻すことを検討する必要があります。なぜあなたはシングルトンでこれをやろうとしていますか?バックグラウンドで音楽を演奏しますか?サービスを利用する。

+0

いいえ、バックグラウンドで音楽をロードしてから、すべてのアクティビティから同じ音楽を呼び出します。 – Ryan

1

メソッドのロードには、Context(つまり、ActivityまたはService)のインスタンスが必要です。シングルトンにそのインスタンスがないため、最初にContextのインスタンスを設定し、その後でそのインスタンスを使用してloadメソッドを呼び出します。

したがって、コンストラクタでこれを行うことはできません。

+0

だから私はどこでそれをしますか?これは私のコードではなく、 "ヘルプコード"から – Ryan

2

applicationContextまたはアクティビティを渡さない限り、非アクティビティクラスのシステムサービスにアクセスすることはできません。 extends Activityクラスでこのコードを実行する必要があります。

サウンドプロバイダが提供するサービスにアクセスするには、コンストラクタにコンテキストを含めるか、サウンドプロバイダ管理オブジェクトを渡してこれらのオブジェクトにアクセスする必要があります。

コードは自明で、クラス内のSoundPoolオブジェクトを宣言してコンストラクタに渡すだけです。

+0

あなたは私にいくつかのコード例を教えてもらえますか? – Ryan

関連する問題