0

在为 Android 开发的 Eclipse Java 中...

Context c = getBaseContext();  // returns null
Context c = this.getBaseContext(); // throws an exception.

Context c = getApplicationContext();  // throws an exception
Context c = this.getApplicationContext();  // throws an exception.

File f = getFilesDir(); // throws an exception
File f = this.getFilesDir(); // throws an exception

如您所见,我根本无法获取应用程序或基本上下文。试图在没有它们的情况下获取文件目录是行不通的。我到底如何才能访问我的文件目录?

public class SoundHandler extends Activity {
private Button mButtonPlay;
private Button mButtonDone;
// private LinearLayout mOverallView;
private PeekActivity mHome;
private MyButtonListener myButtonListener;
private MediaPlayer mPlayer; 
private File audioFilePath;

public SoundHandler(PeekActivity home) {
    mHome = home;
    myButtonListener = new MyButtonListener();
}

public void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);
}

public void open() {
    mHome.setContentView(R.layout.sounds);
    mButtonDone = (Button) mHome.findViewById(R.id.soundDone);     
    mButtonDone.setOnClickListener(myButtonListener);
    mButtonPlay = (Button) mHome.findViewById(R.id.playSound);     
    mButtonPlay.setOnClickListener(myButtonListener);
    mPlayer = null;

                // This is what I thought would work, but it does not
    audioFilePath = this.getBaseContext().getFilesDir().getAbsolutePath();  

                // These are my attempts to see what, if anything works and is not null
                // but I've tried all the combinations and permutations above.
    SoundHandler a = this;
    Context b = getBaseContext();
    Context c = getApplicationContext();
    File d = this.getFilesDir();

                // I'm really just trying to get access to an audio file that is included
                // in my build in file /res/raw/my_audio_file.mp3
                // mPlayer = MediaPlayer.create(this, R.raw.my_audio_file); doesn't work either
}
4

3 回答 3

0

您可能正在自己实例化 Activity 或 Service 或 BroadcastReceiver。如果是这种情况,请知道这些是 Android 可管理对象,您无法实例化它们,单元测试除外。Android 系统将负责根据提供的 Intent 实例化它们。所以不要调用他们的构造函数,它可能看起来“有效”,但它会显示出奇怪的副作用,就像你正在经历的这些副作用一样。

于 2013-07-02T01:04:48.930 回答
0

applicationContext、系统服务都是setContentView在onCreate之后初始化的。它不会像 java 对象那样工作,因为 Android 将 Activity 定义为构建块,就像 java 定义public static void main为起点一样。这里有更少的选择来偏离基础。

你需要启动一个背景Service并使用它的上下文来做你需要的一切。这样你就不会有一个前端 UI,你仍然可以在后台做所有你需要的事情。

于 2013-07-02T16:39:24.047 回答
0

好的,我想通了这一点。我不得不这样做。

audioFilePath = mHome.getBaseContext().getFilesDir().getAbsolutePath();

其中“mHome”是我的主要整体 App Activity 的句柄(或 id 或 context 或任何您喜欢的名称)。即它是传递给这个公共类的构造函数的参数。即,如果这个类被称为 PlayMyAudio 并且它在文件 PlayMyAudio.java 中并且它不是我的应用程序的主要活动。然后“mHome”就是传入我的函数的参数

公共类 PlayMyAudio 扩展 Activity {

   public PlayMyAudio(AppNameActvity home) {
       mHome = home;
       audioFilePath = mHome.getBaseContext().getFilesDir().getAbsolutePath();  
   }

}

于 2013-07-02T20:26:56.947 回答