2017-08-08 171 views
0

我試圖獲取Android設備的內部存儲路徑。Environment.getExternalStorageDirectory()返回null

因爲大多數設備晚點返回使用Environment.getExternalStorageDirectory().getPath();的內部存儲路徑,所以我使用它來獲取路徑。

除了當我從一個非Activity類調用Environment.getExternalStorageDirectory().getPath();它返回null,而如果我從一個Activity類調用它返回正確的路徑,每件事情都很好。

我嘗試搜索其他帖子,但找不到任何有用的東西。

任何幫助都會很感激。

編輯:

if(getExtSdCardPath(con)!=null) 
    { path=getExtSdCardPath(con); 

     if(new File(path).getPath().equal(Environment.getExternalStorageDirectory().getPath())) // This line give null "Null Pointer exception" 
     { 
      return null; 
     } 
     return path; 
    } 

我檢查,如果SD卡路徑是一樣的,其是由Environment.getExternalStorageDirectory().getPath()

+1

'Environment.getExternalStorageDirectory()'不不涉及'Context',所以它的結果不應該根據調用的地方而改變。請提供[mcve]演示如何使用'Environment.getExternalStorageDirectory()'以及如何確定它正在返回'null'。 – CommonsWare

+0

@CommonsWare我添加了一些額外的信息。你能看看嗎? – Rahulrr2602

+1

我認爲'path'更可能是'null',所以'new File(path).getPath()'是'null'。順便說一下,'new File(path).getPath()'是毫無意義的 - 用'path'代替它會更快。而且,請注意'getExternalStorageDirectory()'與大多數Android設備上的「ext sd card」無關。 – CommonsWare

回答

1

理想的情況下,getExtSdCardPath()將是「冪等」,這是一無論多少次你說它,「做同樣的工作,並返回相同的東西」。

就你而言,事實並非如此。第一次撥打電話getExtSdCardPath()會返回您想要的值,第二次撥打getExtSdCardPath()會返回null

在你的情況,沒有特別需要調用getExtSdCardPath()兩次,這樣你就可以通過重寫你的代碼像解決的問題等冪:

path=getExtSdCardPath(con); 
if(path!=null) 
    { 
     if(new File(path).getPath().equal(Environment.getExternalStorageDirectory().getPath())) // This line give null "Null Pointer exception" 
     { 
      return null; 
     } 
     return path; 
    } 
+0

再次感謝您的幫助。 – Rahulrr2602

0

返回聽起來像是你忘了所請求的權限在清單或路徑/忘了在運行時請求這樣的權限(如果你在Android 6.0及以上版本的設備上運行此功能)。

嘗試AddTo就您的清單:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

這裏如何請求允許在運行時快速和簡單的實現示例:

public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback{ 

    private static final int REQUEST_WRITE_PERMISSION = 111; //Number is not matter, just put what you want 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == REQUEST_WRITE_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      //Do your stuff with the file 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     requestPermission(); 
    } 

    private void requestPermission() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION); 
     } else { 
      //Do your stuff with the file 
     } 
    } 
} 
+0

感謝您的回答。但正如問題中所述,它在Activity類中工作正常,並且我已經添加了該權限,同時我也獲得了6.0+的運行時權限。 – Rahulrr2602