【问题标题】:Environment.getExternalStorageDirectory() return nullEnvironment.getExternalStorageDirectory() 返回 null
【发布时间】:2017-08-08 17:50:41
【问题描述】:

我正在尝试获取 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() 返回的路径相同

【问题讨论】:

  • Environment.getExternalStorageDirectory() 不涉及Context,因此其结果不应根据调用位置而改变。请提供minimal reproducible example,说明您如何使用Environment.getExternalStorageDirectory(),以及您如何确定它正在返回null
  • @CommonsWare 我添加了一些额外的信息。你能看看吗?
  • 我认为path更可能是null,所以new File(path).getPath()null。顺便说一句,new File(path).getPath() 毫无意义——用path 替换它会更快。而且,还要注意getExternalStorageDirectory() 与大多数 Android 设备上的“ext sd card”关系不大。
  • @CommonsWare 在调用下一个代码之前,我正在检查分配给path 的值是否不为空getExtSdCardPath(con)!=null。然后我将值分配给路径。所以我觉得导致错误的唯一原因是Environment.getExternalStorageDirectory().getPath()。感谢您的建议,仅将 new File(path).getPath() 替换为 path
  • "我正在检查该值是否..." - 您假设对任何 getExtSdCardPath() 的两次连续调用将返回相同的值。在您当前的实现中,如果第二次调用返回null,那么path 将是null,您将在指定的行上获得NullPointerException。只调用一次getExtSdCardPath(),并检查path本身是否为null

标签: java android file nullpointerexception null


【解决方案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;
    }

【讨论】:

  • 再次感谢您的帮助。
【解决方案2】:

听起来您忘记将请求的权限放在清单中,或者/并且忘记在运行时请求此类权限(如果您在 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
        }
    }
}

【讨论】:

  • 感谢您的回答。但正如问题中所说,它在 Activity 类中运行良好,而且我已经添加了权限,并且我正在获取 6.0+ 的运行时权限。
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 2011-08-28
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
相关资源
最近更新 更多