Android saving file to external storage

后端 未结 12 742
抹茶落季
抹茶落季 2020-11-22 03:12

I have a little issue with creating a directory and saving a file to it on my android application. I\'m using this piece of code to do this :

String filename         


        
相关标签:
12条回答
  • 2020-11-22 03:56

    You need a permission for this

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

    and method:

    public boolean saveImageOnExternalData(String filePath, byte[] fileData) {
    
        boolean isFileSaved = false;
        try {
            File f = new File(filePath);
            if (f.exists())
                f.delete();
            f.createNewFile();
            FileOutputStream fos = new FileOutputStream(f);
            fos.write(fileData);
            fos.flush();
            fos.close();
            isFileSaved = true;
            // File Saved
        } catch (FileNotFoundException e) {
            System.out.println("FileNotFoundException");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("IOException");
            e.printStackTrace();
        }
        return isFileSaved;
        // File Not Saved
    }
    
    0 讨论(0)
  • 2020-11-22 03:58

    I have created an AsyncTask for saving bitmaps.

    public class BitmapSaver extends AsyncTask<Void, Void, Void>
    {
        public static final String TAG ="BitmapSaver";
    
        private Bitmap bmp;
    
        private Context ctx;
    
        private File pictureFile;
    
        public BitmapSaver(Context paramContext , Bitmap paramBitmap)
        {
            ctx = paramContext;
    
            bmp = paramBitmap;
        }
    
        /** Create a File for saving an image or video */
        private  File getOutputMediaFile()
        {
            // To be safe, you should check that the SDCard is mounted
            // using Environment.getExternalStorageState() before doing this. 
            File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
                    + "/Android/data/"
                    + ctx.getPackageName()
                    + "/Files"); 
    
            // This location works best if you want the created images to be shared
            // between applications and persist after your app has been uninstalled.
    
            // Create the storage directory if it does not exist
            if (! mediaStorageDir.exists()){
                if (! mediaStorageDir.mkdirs()){
                    return null;
                }
            } 
            // Create a media file name
            String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
            File mediaFile;
                String mImageName="MI_"+ timeStamp +".jpg";
                mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);  
            return mediaFile;
    
        } 
        protected Void doInBackground(Void... paramVarArgs)
        {   
            this.pictureFile = getOutputMediaFile();
    
            if (this.pictureFile == null) { return null; }
    
            try
            {
                FileOutputStream localFileOutputStream = new FileOutputStream(this.pictureFile);
                this.bmp.compress(Bitmap.CompressFormat.PNG, 90, localFileOutputStream);
                localFileOutputStream.close();
            }
            catch (FileNotFoundException localFileNotFoundException)
            {
                return null;
            }
            catch (IOException localIOException)
            {
            }
            return null;
        }
    
        protected void onPostExecute(Void paramVoid)
        {
            super.onPostExecute(paramVoid);
    
            try
            {
                //it will help you broadcast and view the saved bitmap in Gallery
                this.ctx.sendBroadcast(new Intent("android.intent.action.MEDIA_MOUNTED", Uri
                        .parse("file://" + Environment.getExternalStorageDirectory())));
    
                Toast.makeText(this.ctx, "File saved", 0).show();
    
                return;
            }
            catch (Exception localException1)
            {
                try
                {
                    Context localContext = this.ctx;
                    String[] arrayOfString = new String[1];
                    arrayOfString[0] = this.pictureFile.toString();
                    MediaScannerConnection.scanFile(localContext, arrayOfString, null,
                            new MediaScannerConnection.OnScanCompletedListener()
                            {
                                public void onScanCompleted(String paramAnonymousString ,
                                        Uri paramAnonymousUri)
                                {
                                }
                            });
                    return;
                }
                catch (Exception localException2)
                {
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 03:59

    For API level 23 (Marshmallow) and later, additional to uses-permission in manifest, pop up permission should also be implemented, and user needs to grant it while using the app in run-time.

    Below, there is an example to save hello world! as content of myFile.txt file in Test directory inside picture directory.

    In the manifest:

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

    Where you want to create the file:

    int permission = ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    
    String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    
    if (permission != PackageManager.PERMISSION_GRANTED)
    {
         ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE, 1);
    }
    
    File myDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Test");
    
    myDir.mkdirs();
    
    try 
    {
        String FILENAME = "myFile.txt";
        File file = new File (myDir, FILENAME);
        String string = "hello world!";
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(string.getBytes());
        fos.close();
     }
     catch (IOException e) {
        e.printStackTrace();
     }
    
    0 讨论(0)
  • 2020-11-22 04:01

    since android 4.4 file saving has been changed. there is

    ContextCompat.getExternalFilesDirs(context, name);
    

    it retuns an array.

    when name is null

    the first value is like /storage/emulated/0/Android/com.my.package/files

    the second value is like /storage/extSdCard/Android/com.my.package/files

    android 4.3 and less it retuns a single item array

    parts of little messy code but it demonstrates how it works:

        /** Create a File for saving an image or video 
         * @throws Exception */
        private File getOutputMediaFile(int type) throws Exception{
    
            // Check that the SDCard is mounted
            File mediaStorageDir;
            if(internalstorage.isChecked())
            {
                mediaStorageDir = new File(getFilesDir().getAbsolutePath() );
            }
            else
            {
                File[] dirs=ContextCompat.getExternalFilesDirs(this, null);
                mediaStorageDir = new File(dirs[dirs.length>1?1:0].getAbsolutePath() );
            }
    
    
            // Create the storage directory(MyCameraVideo) if it does not exist
            if (! mediaStorageDir.exists()){
    
                if (! mediaStorageDir.mkdirs()){
    
                    output.setText("Failed to create directory.");
    
                    Toast.makeText(this, "Failed to create directory.", Toast.LENGTH_LONG).show();
    
                    Log.d("myapp", "Failed to create directory");
                    return null;
                }
            }
    
    
            // Create a media file name
    
            // For unique file name appending current timeStamp with file name
            java.util.Date date= new java.util.Date();
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",Locale.ENGLISH)  .format(date.getTime());
    
            File mediaFile;
    
            if(type == MEDIA_TYPE_VIDEO) {
    
                // For unique video file name appending current timeStamp with file name
                mediaFile = new File(mediaStorageDir.getPath() + File.separator + slpid + "_" + pwsid + "_" + timeStamp + ".mp4");
    
            }
            else if(type == MEDIA_TYPE_AUDIO) {
    
                // For unique video file name appending current timeStamp with file name
                mediaFile = new File(mediaStorageDir.getPath() + File.separator + slpid + "_" + pwsid + "_" + timeStamp + ".3gp");
    
            } else {
                return null;
            }
    
            return mediaFile;
        }
    
    
    
        /** Create a file Uri for saving an image or video 
         * @throws Exception */
        private  Uri getOutputMediaFileUri(int type) throws Exception{
    
              return Uri.fromFile(getOutputMediaFile(type));
        }
    
    //usage:
            try {
                file=getOutputMediaFileUri(MEDIA_TYPE_AUDIO).getPath();
            } catch (Exception e1) {
                e1.printStackTrace();
                return;
            }
    
    0 讨论(0)
  • 2020-11-22 04:04

    Update 2018, SDK >= 23.

    Now you should also check if the user has granted permission to external storage by using:

    public boolean isStoragePermissionGranted() {
        String TAG = "Storage Permission";
        if (Build.VERSION.SDK_INT >= 23) {
            if (this.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                Log.v(TAG, "Permission is granted");
                return true;
            } else {
                Log.v(TAG, "Permission is revoked");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }
        }
        else { //permission is automatically granted on sdk<23 upon installation
            Log.v(TAG,"Permission is granted");
            return true;
        }
    }
    
    public void saveImageBitmap(Bitmap image_bitmap, String image_name) {
        String root = Environment.getExternalStorageDirectory().toString();
        if (isStoragePermissionGranted()) { // check or ask permission
            File myDir = new File(root, "/saved_images");
            if (!myDir.exists()) {
                myDir.mkdirs();
            }
            String fname = "Image-" + image_name + ".jpg";
            File file = new File(myDir, fname);
            if (file.exists()) {
                file.delete();
            }
            try {
                file.createNewFile(); // if file already exists will do nothing
                FileOutputStream out = new FileOutputStream(file);
                image_bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.flush();
                out.close();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            MediaScannerConnection.scanFile(this, new String[]{file.toString()}, new String[]{file.getName()}, null);
        }
    }
    

    and of course, add in the AndroidManifest.xml:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    
    0 讨论(0)
  • 2020-11-22 04:05

    Try This :

    1. Check External storage device
    2. Write File
    3. Read File
    public class WriteSDCard extends Activity {
    
        private static final String TAG = "MEDIA";
        private TextView tv;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            tv = (TextView) findViewById(R.id.TextView01);
            checkExternalMedia();
            writeToSDFile();
            readRaw();
        }
    
        /**
         * Method to check whether external media available and writable. This is
         * adapted from
         * http://developer.android.com/guide/topics/data/data-storage.html
         * #filesExternal
         */
        private void checkExternalMedia() {
            boolean mExternalStorageAvailable = false;
            boolean mExternalStorageWriteable = false;
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) {
                // Can read and write the media
                mExternalStorageAvailable = mExternalStorageWriteable = true;
            } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
                // Can only read the media
                mExternalStorageAvailable = true;
                mExternalStorageWriteable = false;
            } else {
                // Can't read or write
                mExternalStorageAvailable = mExternalStorageWriteable = false;
            }
            tv.append("\n\nExternal Media: readable=" + mExternalStorageAvailable
                + " writable=" + mExternalStorageWriteable);
        }
    
        /**
         * Method to write ascii text characters to file on SD card. Note that you
         * must add a WRITE_EXTERNAL_STORAGE permission to the manifest file or this
         * method will throw a FileNotFound Exception because you won't have write
         * permission.
         */
        private void writeToSDFile() {
            // Find the root of the external storage.
            // See http://developer.android.com/guide/topics/data/data-
            // storage.html#filesExternal
            File root = android.os.Environment.getExternalStorageDirectory();
            tv.append("\nExternal file system root: " + root);
            // See
            // http://stackoverflow.com/questions/3551821/android-write-to-sd-card-folder
            File dir = new File(root.getAbsolutePath() + "/download");
            dir.mkdirs();
            File file = new File(dir, "myData.txt");
            try {
                FileOutputStream f = new FileOutputStream(file);
                PrintWriter pw = new PrintWriter(f);
                pw.println("Hi , How are you");
                pw.println("Hello");
                pw.flush();
                pw.close();
                f.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                Log.i(TAG, "******* File not found. Did you"
                    + " add a WRITE_EXTERNAL_STORAGE permission to the   manifest?");
            } catch (IOException e) {
                e.printStackTrace();
            }
            tv.append("\n\nFile written to " + file);
        }
    
        /**
         * Method to read in a text file placed in the res/raw directory of the
         * application. The method reads in all lines of the file sequentially.
         */
        private void readRaw() {
            tv.append("\nData read from res/raw/textfile.txt:");
            InputStream is = this.getResources().openRawResource(R.raw.textfile);
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr, 8192); // 2nd arg is buffer
            // size
            // More efficient (less readable) implementation of above is the
            // composite expression
            /*
             * BufferedReader br = new BufferedReader(new InputStreamReader(
             * this.getResources().openRawResource(R.raw.textfile)), 8192);
             */
            try {
                String test;
                while (true) {
                    test = br.readLine();
                    // readLine() returns null if no more lines in the file
                    if (test == null) break;
                    tv.append("\n" + "    " + test);
                }
                isr.close();
                is.close();
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            tv.append("\n\nThat is all");
        }
    }
    
    0 讨论(0)
提交回复
热议问题