【问题标题】:Cannot access sdcard directory in Android无法在 Android 中访问 sdcard 目录
【发布时间】:2016-08-01 17:26:17
【问题描述】:

我正在开发一个名为 camera.app 的小型应用程序项目,它会拍照并在屏幕上返回照片。当照片是局部变量时,我可以完成所有步骤。但是,当我想将其保存在特定路径中并从路径中读取时,Android 总是会发出警告

'E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/camera_app/cam_image.jpg: open failed: ENOENT (No such file or directory)'

也有看不懂的警告,比如

 E/linker: readlink('/proc/self/fd/42') failed: Permission denied [fd=42]


E/HiApp.SerializedObject: Thread-840{840} a.b(null:-1) <<< ERROR >>> read file error/storage/emulated/0/Android/data/com.huawei.appmarket/files/Data/.AppCheckInfo: open failed: ENOENT (No such file or directory)

计算机可以读取 sdcard。不知道怎么调试代码

Button button;
ImageView imageView;
static final int CAM_REQUEST = 1;
String SDPath = Environment.getExternalStorageDirectory().getAbsolutePath();
    TextView SDCard;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = (Button) findViewById(R.id.bn);
    imageView = (ImageView) findViewById(R.id.img);
    SDCard = (TextView)findViewById(R.id.sdcard);
    SDCard.setText(SDPath);
    button.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File file = getFile();
            Uri contentUri = Uri.fromFile(file);
            camera_intent.putExtra(MediaStore.EXTRA_OUTPUT,contentUri);
            startActivityForResult(camera_intent,CAM_REQUEST);

        }});
}

private File getFile(){
    File folder = new File(SDPath+"/camera_app");//"EVA-AL10/sdcard/camera_app" "storage/1599-2841/camera_app"
    if(!folder.exists()){
        folder.mkdir();
    }
    File image_file = new File(folder,"cam_image.jpg");
    return image_file;
}

protected void onActivityResult(int requestCode, int resultCode, Intent data){
    String path = SDPath+"/camera_app/cam_image.jpg";//"EVA-AL10/sdcard/camera_app/cam_image.jpg"
    imageView.setImageDrawable(Drawable.createFromPath(path));
}

更新的 xml:

<uses-feature android:name="android.hardware.camera2"
android:required="true"></uses-feature>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

【问题讨论】:

  • 如果您的目标是 SDK 23+,请确保您拥有运行时请求权限。
  • 您在哪个版本的 android 上测试您的应用?

标签: android android-external-storage


【解决方案1】:

我认为您缺少权限:READ_EXTERNAL_STORAGE

【讨论】:

  • 谢谢!我添加了权限,但应用程序仍然无法运行。好像找不到我设置的SD卡路径。
【解决方案2】:

检查您的清单文件。

你需要添加这两个权限

READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

【讨论】:

    【解决方案3】:

    如果您的目标是 api 23+,那么您应该添加运行时权限检查。在您的第一个启动活动中,您需要添加此代码

    @Override
    protected void onResume() {
        super.onResume();
        if (Build.VERSION.SDK_INT >= 23){
            checkAllPermissions();
        }
    }
    

    这里是检查所有权限的方法

    private void checkAllPermissions() {
        if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_STORAGE);
            Log.d(TAG, "checkAllPermissions: inside write external");
        }
        if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_STORAGE);
            Log.d(TAG, "checkAllPermissions: inside read external");
        }}
    

    希望这会对你有所帮助。

    【讨论】:

    • 谢谢! mActivity、MY_PERMISSIONS_REQUEST_STORAGE 和 TAG 无法解析。都是字符串吗?
    • 不,它是一个常量私有 int MY_PERMISSIONS_REQUEST_STORAGE = 1;
    • mActivity 是一个字符串?还是一个类?
    • mActivity 是上下文对象,即私有Activity mActivity; mActivity = MainActivity.this;
    • 如果您的问题解决了,请将其标记为已接受,因为它可以帮助其他人获得任何问题的正确答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多