Android,如何让这个工作?

时间:2011-08-16 15:16:07

标签: android

首先请注意我是菜鸟。

我想做什么: 从活动中调用其他类中的代码 一旦工作,我想开始一个新的活动,并从那里调用代码(请告诉我这是怎么做的)

我正在处理这个例子: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

谢谢!
莱恩

1 个答案:

答案 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;
   }
}