【发布时间】:2023-04-06 15:36:01
【问题描述】:
我知道关于这个确切的主题有很多问题,但是在花了两天时间阅读和尝试之后,没有一个可以解决我的问题。
这是我的代码:
我在我的onCreate() 中启动ACTION_GET_CONTENT
Intent selectIntent = new Intent(Intent.ACTION_GET_CONTENT);
selectIntent.setType("audio/*");
startActivityForResult(selectIntent, AUDIO_REQUEST_CODE);
在onActivityResult()中检索Uri
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AUDIO_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
if ((data != null) && (data.getData() != null)) {
audio = data.getData();
}
}
}
将Uri 传递给另一个活动并检索它
Intent debugIntent = new Intent(this, Debug.class);
Bundle bundle = new Bundle();
bundle.putString("audio", audio.toString());
debugIntent.putExtras(bundle);
startActivity(debugIntent);
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
audio = Uri.parse((String) bundle.get("audio"));
我已经根据另一个 SO 答案实现了这个方法。获取 Uri 的实际路径
public static String getRealPathFromUri(Activity activity, Uri contentUri) {
String[] proj = { MediaStore.Audio.Media.DATA };
Cursor cursor = activity.managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
并在调试活动的onCreate() 中尝试生成文件:
File audioFile = new File(getRealPathFromUri(this, audio));
这是错误的样子:
原因:java.lang.NullPointerException 在 java.io.File.(File.java:262) 在 com.dancam.lietome.Debug.onCreate(Debug.java:35)
当我运行应用程序时,我在最后一行得到一个 NPE。音频 Uri 不是 NULL,所以我不明白它是由什么引起的。
如果你能帮助我,我将不胜感激。
This is the library我正在努力合作。
注意:我确切地知道 NPE 是什么,但即使调试我也无法从这种特定情况下的原因中弄清楚。
【问题讨论】:
-
@isabsent 我没有看到任何结果我得到了 NPE
-
我明白了。在方法
getRealPathFromUri(Activity activity, Uri contentUri)中为每个字符串设置断点并找出导致NPE 的字符串。我想cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)会抛出 NPE。 -
您需要
File做什么?你有一个Uri,就用它,不,不需要传递String,改用Intent#setData -
只需使用
ContentResolverAPI - 它具有打开任何基于content://的Uri的方法 -
然后尝试阅读
ContentResolver文档,但您没有回答我的问题:您想在哪里使用您的音频Uri?你有机会可以更轻松地做到这一点......