2011-08-16 64 views
0

注意:我是一個noob,所以不真正知道這些錯誤是什麼意思。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; 
    } 
} 

而且我得到兩個錯誤,第一個錯誤是在這裏:

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) 和第二個錯誤是在這裏:

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

and the error says The method getSystemService(String) is undefined for the type MySingleton

回答

1

您需要使用Context來使用這些方法。 getSystemService是Context實例的一種方法,myActivity.getSystemService()load()也期望您傳遞Context實例(myActivity)作爲第一個參數。不建議您保留對主要活動之外的上下文的引用,所以您應該考慮將此邏輯移回到活動中。你爲什麼試圖在單身人士身上做到這一點?在後臺播放音樂?使用服務。

+0

不,只需在背景中加載音樂...然後從每個活動中調用相同的音樂 – Ryan

1

該方法負載需要Context(即ActivityService)的實例。由於你的單例沒有那個實例,你需要首先設置一個Context的實例,並且只有在那之後,使用該實例調用load方法。

因此,你不能在你的構造函數中做到這一點。

+0

那麼我在哪裏做?這不是我的代碼,而是來自SO – Ryan

2

除非您傳入applicationContext或activity,否則無法訪問非活動類中的系統服務。你需要在你的extends Activity課上做這個代碼。

爲了訪問聲音提供程序提供的服務或傳遞聲音提供程序管理對象以訪問這些對象,需要在構造函數中包含上下文。

代碼應該很簡單,只需在您的類中聲明一個SoundPool對象並將其傳遞給構造函數即可。

+0

的「幫助代碼」請你給我一些示例代碼嗎? – Ryan

相關問題