首先请注意我是菜鸟。
我想做什么: 从活动中调用其他类中的代码 一旦工作,我想开始一个新的活动,并从那里调用代码(请告诉我这是怎么做的)
我正在处理这个例子:http://stackoverflow.com/questions/7061594/loading-mp3s-into-the-sound-pool-in-android
现在,当我点击按钮时,它会退出:(
我的代码:
class MyApp extends Application {
private static MyApp singleton;
private static SoundPool mSoundPool;
private HashMap<Integer, Integer> soundPoolMap;
public static final int A1 = 1;
@Override
public void onCreate() { // This onCreate is for this class
super.onCreate();
singleton = this;
mSoundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);// Just an example
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(A1, mSoundPool.load(MyApp.this, R.raw.a, 1));
}
public void playSound(int sound) {
AudioManager mgr = (AudioManager)MyApp.this.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 static MyApp getInstance() {
return singleton;
}
public SoundPool getSoundPool() {
return mSoundPool;
}
}
public class TestAndroidGlobalsActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void next_activity(View v)
{
//MyApp.getInstance().getSoundPool().playSound(1);
MyApp.getInstance().playSound(1);
}
}
我的清单文件,如果你需要它:
http://pastebin.com/YHjgGPyd
谢谢!
莱恩
答案 0 :(得分:2)
我认为您的错误来自于清单中有两个应用程序标记。这导致您的第二个应用程序永远不会实例化,因此当您尝试使用它时,您将获得NullPointerException。
删除第二个并将第一个更改为:
<application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name">
虽然这个例子可能是一个很好的实践,但你真的不应该像这样使用Application类。让我引用Android开发者:
*“通常不需要子类Application。在大多数情况下,静态单例可以以更模块化的方式提供相同的功能。如果您的单例需要全局上下文(例如注册广播接收器),则函数为检索它可以给一个Context,它在第一次构造单例时在内部使用Context.getApplicationContext()。“
http://developer.android.com/intl/de/reference/android/app/Application.html
只是谷歌如何制作一个漂亮的单身人士,并在构造函数中给它一个应用程序上下文:)
编辑:
这是与单身人士相同的班级。最好使用它而不是继续使用Application类。
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(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)MyApp.this.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;
}
}