2017-10-20 82 views
-1

播放由MediaPlayer用戶指定的mp3文件時遇到了某些問題。setDataSource()IO異常

try { 
     mPlayer = new MediaPlayer(); 
     mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mPlayer.setDataSource(getApplicationContext(), audio); 
     mPlayer.prepare(); 
     mPlayer.start(); } 
     catch (IOException e) { 
      numberText.setText("IO EXCEPTION"); 
      e.printStackTrace(); 
     } 

問題是在mPlayer.setDataSource(getApplicationContext(),音頻)

在這裏,我從用戶獲得指定的MP3

setAudio.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setType("audio/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(intent,1); 


     } 


     protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 

      if (requestCode == 1) { 

       if (resultCode == RESULT_OK) { 
        audioPath = intent.getData().getPath(); 
        audio = Uri.parse(audioPath); 
       } 
      } 
     } 


    }); 

錯誤日誌顯示該

setDataSource: SecurityException! uri=content://com.android.providers.downloads.documents/document/1545 
                        java.lang.SecurityException: Permission Denial: opening provider com.android.providers.downloads.DownloadStorageProvider from ProcessRecord{7b8354b 23595:com.example.m1tr0s0ul4s.thatawkwardcall/u0a137} (pid=23595, uid=10137) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 
                         at android.os.Parcel.readException(Parcel.java:1540) 
                         at android.os.Parcel.readException(Parcel.java:1493) 
                         at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3372) 
                         at android.app.ActivityThread.acquireProvider(ActivityThread.java:4819) 
                         at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2527) 
                         at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1486) 
                         at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1092) 
                         at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:932) 
                         at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:859) 
                         at android.media.MediaPlayer.setDataSource(MediaPlayer.java:987) 
                         at android.media.MediaPlayer.setDataSource(MediaPlayer.java:961) 
                         at com.example.m1tr0s0ul4s.thatawkwardcall.AcceptCall.onCreate(AcceptCall.java:55) 
                         at android.app.Activity.performCreate(Activity.java:5966) 
                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2408) 
                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2517) 
                         at android.app.ActivityThread.access$800(ActivityThread.java:162) 
                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412) 
                         at android.os.Handler.dispatchMessage(Handler.java:106) 
                         at android.os.Looper.loop(Looper.java:189) 
                         at android.app.ActivityThread.main(ActivityThread.java:5529) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at java.lang.reflect.Method.invoke(Method.java:372) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751) 
10-20 17:31:13.041 23595-23595/com.example.m1tr0s0ul4s.thatawkwardcall 
E/MediaPlayer: Unable to create media player 

我幾乎不知道是怎麼回事:/請幫助

回答

0

如果你已經請求運行權限試試這個代碼:

if (Build.VERSION.SDK_INT < 19) { 
    intent = new Intent(); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    intent.setType("*/*"); 
    startActivityForResult(intent, 1); 
} else { 
    intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("*/*"); 
    startActivityForResult(intent, 1); 
} 

如果你沒有,那麼你必須在棉花糖及以上檢查運行權限。 此代碼添加到您的Manifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

現在,在您setAudio的的onClick你需要檢查用戶是否已經給你權限來訪問設備

setAudio.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 11); 

     } else { 
       //You already have the permission, just go ahead. 
       if (Build.VERSION.SDK_INT < 19) { 
         intent = new Intent(); 
         intent.setAction(Intent.ACTION_GET_CONTENT); 
         intent.setType("*/*"); 
         startActivityForResult(intent, 1); 
       } else { 
         intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
         intent.addCategory(Intent.CATEGORY_OPENABLE); 
         intent.setType("*/*"); 
         startActivityForResult(intent, 1); 
       } 
     } 
} 

當你請求的存儲用戶操作的許可返回onRequestPermissionResult(..)。以下是您可以如何處理用戶操作的方法。

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == 11) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      //The External Storage READ Permission is granted to you... Continue your left job... 
       if (Build.VERSION.SDK_INT < 19) { 
         intent = new Intent(); 
         intent.setAction(Intent.ACTION_GET_CONTENT); 
         intent.setType("*/*"); 
         startActivityForResult(intent, 1); 
       } else { 
         intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 
         intent.addCategory(Intent.CATEGORY_OPENABLE); 
         intent.setType("*/*"); 
         startActivityForResult(intent, 1); 
       } 
     } else{ 
      //permission denied 
     } 
} 
+0

您是否在我的答案中嘗試了第一段代碼?如果您的權限正確放置,那麼您應該嘗試下一步。 –

+0

那麼修復它。謝謝。但是我的清單中已經有了許可權限,所以我沒有得到問題所在。 – Dimitris

+0

只需添加到清單文件中就無濟於事。您需要實時請求權限,或者讓用戶轉到設置並啓用權限。第一部分代碼與權限無關。 –

0
   audioPath = intent.getData().getPath(); 
       audio = Uri.parse(audioPath); 

intent.getData()已經返回Uri對象,所以你有可能丟掉念想方案,主機或查詢屬性的特定文件所需的數據。

+0

所以我可以做audio = intent.getData(); ?? – Dimitris