Environment.getExternalStorageDirectory()返回null

时间:2017-08-08 17:50:41

标签: java android file nullpointerexception null

我试图获取Android设备的内部存储路径。

由于大多数设备迟到了使用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()

返回的路径相同

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

听起来您忘记将所请求的权限放入清单中OR / AND忘记在运行时请求此类权限(如果您在使用Android 6.0及更高版本的设备上运行此权限)。

尝试添加到您的清单:<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
        }
    }
}