2016-05-23 105 views
0

Android說,那listOfFiles如果爲null,那麼我做錯了什麼? 我試圖改變getPath getAboletePath,但它是一樣的。 而且,我試圖訪問/存儲/(而SD_PATH是/存儲/模擬/ 0),我有一個2個文件夾的列表:模擬和自我,這兩個都是無法訪問。爲什麼listOfFiles爲null?

public class MainActivity extends AppCompatActivity { 

    private static final String SD_PATH = Environment.getExternalStorageDirectory().getPath(); 

    ... 

File home = new File(SD_PATH); 
     File[] listOfFiles = home.listFiles(); 
     if(listOfFiles != null && listOfFiles.length > 0){ 
      for (File file : home.listFiles()){ 
       songs.add(file.getName()); 
      } 
     } 

這裏是我的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.unimusic"> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

您定位的是哪個版本的API? – curob

+0

minSdk是15,目標sdk是23 –

+0

嘗試將目標SDK更改爲22.如果這有效,那麼我會寫一個描述爲什麼以及如何解決它的答案。 – curob

回答

2

這同樣的事情已經燒到了我的過去。

引述文檔

在在Android 6.0(API級別23)開始,用戶授予權限的應用程序應用程序運行時,而不是當他們安裝應用程序。

(見here

從文件系統讀取的是,現在必須在運行時才能使用請求的權限之一。如果您的目標是SDK 23或更高版本,這只是一個問題。所以如何解決:

該文檔顯示了一個示例(請參閱原始的here),我修改了您的用例(我沒有運行此代碼,但它應該是一個很好的起點)。您可能想要爲onCreate()請求需要權限的活動(在您的案例中爲MainActivity)。

// Ask for the read external storage permission 
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
{ 
    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) 
    { 
     // Provide an additional rationale to the user if the permission was not granted 
     // and the user would benefit from additional context for the use of the permission. 
     // Display a SnackBar with a button to request the missing permission. 
     Snackbar.make(layout, 
        "External storage is needed in order to {YOUR EXPLANATION HERE}", 
        Snackbar.LENGTH_INDEFINITE).setAction("OK", new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View view) 
       { 
        // Request the permission 
        ActivityCompat.requestPermissions(MainActivity.this, 
          new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0); 
       } 
      }).show(); 
     } 
     else 
     { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0); 
     } 
} 
+0

它的工作,但現在我有requestPermissions一個新的錯誤。應用程序只是崩潰與一個錯誤包安裝程序崩潰(像這樣的smth,有一些翻譯錯誤,因爲我使用的是俄語) –

+0

好吧,謝謝,我的錯。我認爲如果我要求權限,它不需要預先添加到AndroidManifest.xml中:D –