簡體   English   中英

從 Uri 獲取 mp3 文件的真實路徑

[英]Get Real Path of mp3 file from Uri

我從extend PreferenceFragmentCompat的 Fragment 中的 Content Picker 意圖中選擇了音頻文件

   Intent intent = new Intent();
   intent.setAction(Intent.ACTION_GET_CONTENT);
   intent.setType("audio/mpeg");
   startActivityForResult(intent, 1);

並從onActivityResult檢索Uri

@Override
public void onActivityResult(int requestCode, int resultcode, Intent data) {
    if (requestCode == 1 && resultcode == Activity.RESULT_OK) {
        audio = data.getData();
        inputfile= (FileInputStream  getActivity().getApplicationContext().getContentResolver().openInputStream(data.getData());
    }
    super.onActivityResult(requestCode, resultcode, data);
}

音頻被聲明為公開的地方(Uri 音頻)。 現在我希望將此音頻文件復制到應用程序目錄中的目錄( /data/data/com.example.focusit )。為此我需要從 URI 獲取音頻文件的真實路徑

public String getRealPathFromUri(Uri contentUri) {
    String res = null;
    String[] proj = {
        MediaStore.Audio.Media.DATA
    };
    Cursor cursor = (Cursor) getActivity().getApplicationContext().getContentResolver().query(contentUri, proj, null, null, null);
    if (cursor.moveToFirst()) {
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
        res = cursor.getString(column_index);
    }
    cursor.close();
    return res;
}

現在要將音頻文件復制到我的目錄,我使用了這段代碼

File audiofile = new File(audio.getPath());
String realpath = getRealPathFromUri(audio);
File file = new File("/data/data/com.example.focusit/Focusit_SOS/tt_temp.mp3");
if (!file.exists()) {
    Toast.makeText(getContext(), "Director focus it does not existed", Toast.LENGTH_SHORT).show();
    file.mkdirs();
}
try {
    FileUtils.copy(new FileInputStream(audiofile), new FileOutputStream(file));enter code here
} catch (IOException e) {
    e.printStackTrace();

但問題是 function getRealPathFromUri(Uri ContentUri) cursor.movetoFirst()返回 false。知道如何處理它。 audio.getpath audio.getpath()的 Output 是/external/audio/media/8099

我嘗試了一種解決方案,直接從 onActivityResult() 中的 Uri 創建輸入 stream

 inputfile= (FileInputStream) getActivity().getApplicationContext().getContentResolver().openInputStream(data.getData());

但我有例外

2020-10-28 07:41:31.333 21292-21292/com.example.focusit E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.focusit, PID: 21292
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=-1, data=Intent { dat=content://media/external/audio/media/8099 (has extras) }} to activity {com.example.focusit/com.example.focusit.SettingsActivity}: java.lang.SecurityException: com.example.focusit has no access to content://media/external/audio/media/8099
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4905)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4946)
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7520)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
 Caused by: java.lang.SecurityException: com.example.focusit has no access to content://media/external/audio/media/8099
    at android.os.Parcel.createException(Parcel.java:2074)
    at android.os.Parcel.readException(Parcel.java:2042)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
    at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:151)
    at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:705)
    at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1702)
    at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1518)
    at android.content.ContentResolver.openInputStream(ContentResolver.java:1202)
    at com.example.focusit.SettingsActivity$SettingsFragment.onActivityResult(SettingsActivity.java:227)
    at androidx.fragment.app.FragmentActivity.onActivityResult(FragmentActivity.java:170)
    at android.app.Activity.dispatchActivityResult(Activity.java:8249)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4898)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4946) 
    at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:224) 
    at android.app.ActivityThread.main(ActivityThread.java:7520) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) `

提供存儲訪問將解決異常

java.lang.SecurityException: com.example.focusit has no access to content:

不要在您沒有的路徑上打開 FileInputStream。

而是直接在獲得的 uri 上打開 InputStream。

InputStream is = getContentResolver().openInputStream(data.getData());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM