2017-10-18 106 views
0

我遇到问题。我想让我的应用程序的用户使用ACTION_GET_CONTENT从存储中选择一个音频文件,并且此时mainActivity崩溃。我的应用程序在从用户获取uri时崩溃

 public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setType("audio/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(intent,1); 
      audioPath = intent.getData().getPath(); //This is were the crash happens 
      audio = Uri.parse(audioPath); 

     } 

我是新的android编程,肯定有些东西我不明白。错误如下:java.lang.NullPointerException:尝试调用空对象上的虚拟方法'java.lang.String android.net.Uri.getPath()'参考

+0

启动它正在崩溃的部分,您最好在'onActivityResult'中执行该操作。你现在正在使用'Intent',你刚刚开始一个'Activity'。一个意图,你没有提供数据,因此当获得数据的路径时,你得到一个NPE – 0xDEADC0DE

回答

1

您必须覆盖Activity Result in你的活动。 不要像你所做的一样使用相同的意图。您必须使用onActivityResult方法中返回的Intent。所以,你的代码应该是:

这应该是你的方法来选择一个音频

public void onClick(View v) { 
     Intent intent = new Intent(); 
     intent.setType("audio/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(intent,1); //This 1 is your request code remember it 
    } 

然后重写onActivityResult方法

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     //The intent from this method is the one you need to get data from! 
     if (requestCode == 1) { 
     // Make sure the request was successful 
      if (resultCode == RESULT_OK) { 
       audioPath = intent.getData().getPath(); 
       audio = Uri.parse(audioPath); 
       } 
     } 
    } 

欲了解更多有关此方法,并从活动结果check this official training from Android接收数据。快乐编码!

+0

当用户完成选择时自动调用它。这只有当你使用'startActivityForResult'而不是'startActivity'。同时请记住你只覆盖一次。即使您也希望用户也选择图片或其他内容,只需传递不同的请求代码即可。对于您的问题,我们将我们的请求代码作为1传递。在挑选音频之后,我们首先检查请求代码是否为1,然后从意向中检索Value!所以,如果你想要一个用户选择一个图像使用另一个'int'可以说2或其他东西! – Xenolion

+0

非常感谢!奇迹般有效。 – Dimitris

+0

欢迎您! – Xenolion

相关问题