无法访问Android中的sdcard目录

时间:2016-08-01 17:26:18

标签: android android-external-storage

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

Welcome good morning
Validate {username} and {password}
Report generate my report

还有一些我不理解的警告,例如

'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)'

计算机可以读取SD卡。我不知道如何调试代码

 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)

更新了xml:

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));
}

3 个答案:

答案 0 :(得分:0)

我认为你错过了一项权限:READ_EXTERNAL_STORAGE

答案 1 :(得分:0)

检查您的清单文件。

您需要添加这两个权限

READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

答案 2 :(得分:0)

如果您的目标是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");
    }}

希望这会对你有所帮助。