Android如何保存文件?

时间:2017-04-12 09:58:18

标签: android

我需要将一些文件保存到我的Android手机中。 所以我使用了类似的东西:

FileOutputStream os = null;
 try{
     os = new FileOutputStream("/root/sdcard/DCIM/1.jpg");
     os.write(bytes);
     os.close();
 }catch(FileNotFoundException e){}

当我这样做时,它会说像

java.io.FileNotFoundException: /root/sdcard/DCIM/1.jpg (Permission denied)

顺便说一下,我已经使用类似的东西在AndroidManifest.xml中请求了权限:

<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我也试过

getFilesDir().getAbsolutePath();

它实际上指的是

/data/user/0/come.package.xxx/files

我不知道这条路在哪里,因为我在手机上找不到它。 当我使用ASUS文件管理器时,我看到路径是/ root / sdcard / ...,但我的手机中甚至没有SD卡,我已经使用iPhone多年了,所以我不知道Android文件系统现在如何工作。

这对我来说真的很困惑,有人可以向我解释一下Android文件系统是如何工作的吗?谢谢大家!

3 个答案:

答案 0 :(得分:0)

在Android上保存图片:

private String saveToInternalStorage(String name, Bitmap bitmapImage){
        ContextWrapper cw = new ContextWrapper(context);
        // path to /data/data/yourapp/app_data/imageDir
        File directory = cw.getDir(IMAGE_TAG, Context.MODE_PRIVATE);
        // Create imageDir
        File mypath = new File(directory, name + ".jpg");

        FileOutputStream fos = null;

        try {
            fos = new FileOutputStream(mypath);
            // Use the compress method on the BitMap object to write image to the OutputStream
            bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return directory.getAbsolutePath();
    }

加载图片:

public void loadImage(ImageView imageView) {
        // get path
        ContextWrapper cw = new ContextWrapper(context);
        File directory = cw.getDir(IMAGE_TAG, Context.MODE_PRIVATE);
        String path = directory.getAbsolutePath();

        // load image
        try {
            File f = new File(path, name + ".jpg");
            Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
            imageView.setImageBitmap(b);
            imageView.setVisibility(View.VISIBLE);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Log.d("Image", "Image file not found.");    
        }
}

答案 1 :(得分:0)

如果您使用的是Android 6.0 Marsh或更高版本的Android版本,则需要在代码下方提供运行时权限。

  if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            camera.setEnabled(false);
           ActivityCompat.requestPermissions(getActivity(), new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
       }
 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 0) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                //permission will get success here
                //do what you want
            }
            else {
                //Permission not granted
                Toast.makeText(getActivity(),"You need to grant camera permission to use camera",Toast.LENGTH_LONG).show();
            }
        }
    }

答案 2 :(得分:0)

如果您使用的是marshmallow或最新版本的Android,那么您需要在运行时提供权限,在您的按钮上点击,而不是需要调用您的代码将文件保存到SD卡。

之后比这样,

public void onClick(View v) {
    // write on SD card file data in the text box
    try {
        File myFile = new File("/sdcard/mysdfile.txt");
        myFile.createNewFile();
        FileOutputStream fOut = new FileOutputStream(myFile);
        OutputStreamWriter myOutWriter = 
                                new OutputStreamWriter(fOut);
        myOutWriter.append(txtData.getText());
        myOutWriter.close();
        fOut.close();
        Toast.makeText(getBaseContext(),
                "Done writing SD 'mysdfile.txt'",
                Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(getBaseContext(), e.getMessage(),
                Toast.LENGTH_SHORT).show();
    }
}