|
| 1 | +package com.celites.androidexternalfilewriter; |
| 2 | + |
| 3 | +import android.annotation.TargetApi; |
| 4 | +import android.app.Activity; |
| 5 | +import android.content.Intent; |
| 6 | +import android.content.SharedPreferences; |
| 7 | +import android.net.Uri; |
| 8 | +import android.os.Build.VERSION_CODES; |
| 9 | +import android.os.ParcelFileDescriptor; |
| 10 | +import android.preference.PreferenceManager; |
| 11 | +import android.support.v4.content.ContextCompat; |
| 12 | +import android.support.v4.provider.DocumentFile; |
| 13 | +import android.text.TextUtils; |
| 14 | +import com.ceelites.devutils.ConstantMethods; |
| 15 | +import java.io.File; |
| 16 | +import java.io.FileNotFoundException; |
| 17 | +import java.io.FileOutputStream; |
| 18 | +import java.io.IOException; |
| 19 | + |
| 20 | +/** |
| 21 | + * Created by Prasham on 12/25/2015. |
| 22 | + */ |
| 23 | +@TargetApi(VERSION_CODES.LOLLIPOP) |
| 24 | +public class SAFFileWriter { |
| 25 | + |
| 26 | + private String PARENT_URI_KEY = "APP_EXTERNAL_PARENT_FILE_URI"; |
| 27 | + private Activity activity; |
| 28 | + private DocumentFile appCacheDirectory; |
| 29 | + private DocumentFile appDirectory; |
| 30 | + private DocumentFile externalCacheDirectory; |
| 31 | + private DocumentFile externalParentFile; |
| 32 | + private int requestCode; |
| 33 | + private static final String canNotCreateDirectory = "Can not create directory: "; |
| 34 | + private static final String canNotWriteFile = "Can not write file: "; |
| 35 | + |
| 36 | + |
| 37 | + public SAFFileWriter(Activity activity, int requestCode) { |
| 38 | + this.activity = activity; |
| 39 | + this.requestCode = requestCode; |
| 40 | + File[] dirs = ContextCompat.getExternalCacheDirs(activity); |
| 41 | + if (dirs.length > 1) { |
| 42 | + File dir = dirs[1]; |
| 43 | + if (dir != null) { |
| 44 | + externalCacheDirectory = DocumentFile.fromFile(dir); |
| 45 | + } else { |
| 46 | + externalCacheDirectory = DocumentFile.fromFile(dirs[0]); |
| 47 | + } |
| 48 | + } else { |
| 49 | + externalCacheDirectory = DocumentFile.fromFile(dirs[0]); |
| 50 | + } |
| 51 | + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity); |
| 52 | + String externalDirUrl = preferences.getString(PARENT_URI_KEY, ""); |
| 53 | + if (ConstantMethods.isEmptyString(externalDirUrl)) { |
| 54 | + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); |
| 55 | + activity.startActivityForResult(intent, requestCode); |
| 56 | + } |
| 57 | + } |
| 58 | + |
| 59 | + public DocumentFile createSubDirectory(String displayName, DocumentFile parentDirectory) { |
| 60 | + return parentDirectory.createDirectory(displayName); |
| 61 | + } |
| 62 | + |
| 63 | + public DocumentFile createSubdirectory(String directoryName, boolean inCache) { |
| 64 | + DocumentFile appDirectory = getAppDirectory(inCache); |
| 65 | + return appDirectory.createDirectory(directoryName); |
| 66 | + } |
| 67 | + |
| 68 | + public DocumentFile getAppDirectory() { |
| 69 | + if (appDirectory == null) { |
| 70 | + createAppDirectory(); |
| 71 | + } |
| 72 | + return appDirectory; |
| 73 | + } |
| 74 | + |
| 75 | + private void createAppDirectory() { |
| 76 | + String directoryName = activity.getString(activity.getApplicationInfo().labelRes); |
| 77 | + appDirectory = externalParentFile.createDirectory(directoryName); |
| 78 | + appCacheDirectory = externalCacheDirectory.createDirectory(directoryName); |
| 79 | + } |
| 80 | + |
| 81 | + public void handleResult(int requestCode, int resultCode, Intent data) { |
| 82 | + if (resultCode == Activity.RESULT_OK) { |
| 83 | + if (requestCode == this.requestCode) { |
| 84 | + Uri treeUri = data.getData(); |
| 85 | + externalParentFile = DocumentFile.fromTreeUri(activity, treeUri); |
| 86 | + |
| 87 | + |
| 88 | + } |
| 89 | + } |
| 90 | + } |
| 91 | + |
| 92 | + public boolean isDirectoryExists(String displayName, DocumentFile parentDirectory) { |
| 93 | + DocumentFile file = parentDirectory.findFile(displayName); |
| 94 | + return file != null && file.isDirectory(); |
| 95 | + } |
| 96 | + |
| 97 | + public boolean isDirectoryExists(String displayName, boolean inCache) { |
| 98 | + DocumentFile file = getDocumentFile(displayName, inCache); |
| 99 | + return file != null && file.isDirectory(); |
| 100 | + } |
| 101 | + |
| 102 | + private DocumentFile getDocumentFile(String displayName, boolean inCache) { |
| 103 | + DocumentFile appDirectory = getAppDirectory(inCache); |
| 104 | + return appDirectory.findFile(displayName); |
| 105 | + } |
| 106 | + |
| 107 | + public boolean isFileExists(String displayName, boolean inCache) { |
| 108 | + DocumentFile file = getDocumentFile(displayName, inCache); |
| 109 | + return file != null && file.isFile(); |
| 110 | + } |
| 111 | + |
| 112 | + public boolean isFileExists(String displayName, DocumentFile parentDirectory) { |
| 113 | + DocumentFile file = parentDirectory.findFile(displayName); |
| 114 | + return file != null && file.isFile(); |
| 115 | + } |
| 116 | + |
| 117 | + public void writeDataToFile(String fileName, String mimeType, byte[] data, boolean inCache) throws FileNotFoundException { |
| 118 | + DocumentFile appDir = getAppDirectory(inCache); |
| 119 | + writeDataToFile(appDir, fileName, data, mimeType); |
| 120 | + } |
| 121 | + |
| 122 | + public void writeDataToFile(DocumentFile parent, String fileName, byte[] data, String mimeType) throws FileNotFoundException { |
| 123 | + DocumentFile file = createFile(fileName, parent, mimeType); |
| 124 | + writeDataToFile(file, data); |
| 125 | + } |
| 126 | + |
| 127 | + private void writeDataToFile(DocumentFile file, byte[] data) throws FileNotFoundException { |
| 128 | + ParcelFileDescriptor fileDescriptor = activity.getContentResolver().openFileDescriptor(file.getUri(), "w"); |
| 129 | + FileOutputStream out = null; |
| 130 | + if (fileDescriptor != null) { |
| 131 | + out = new FileOutputStream(fileDescriptor.getFileDescriptor()); |
| 132 | + try { |
| 133 | + out.write(data); |
| 134 | + out.close(); |
| 135 | + } catch (IOException e) { |
| 136 | + e.printStackTrace(); |
| 137 | + } |
| 138 | + } |
| 139 | + } |
| 140 | + |
| 141 | + public void writeDataToFile(String fileName, String mimeType, String data, boolean inCache) throws FileNotFoundException { |
| 142 | + DocumentFile appDir = getAppDirectory(inCache); |
| 143 | + writeDataToFile(appDir, fileName, data, mimeType); |
| 144 | + } |
| 145 | + |
| 146 | + public void writeDataToFile(DocumentFile parent, String fileName, String data, String mimeType) throws FileNotFoundException { |
| 147 | + DocumentFile file = createFile(fileName, parent, mimeType); |
| 148 | + writeDataToFile(file, data); |
| 149 | + } |
| 150 | + |
| 151 | + /** |
| 152 | + * Write byte array to file. Will show error if given file is a directory. |
| 153 | + * |
| 154 | + * @param file |
| 155 | + * : File where data is to be written. |
| 156 | + * @param data |
| 157 | + * String which you want to write a file. If size of this is greater than size available, it will show error. |
| 158 | + */ |
| 159 | + private void writeDataToFile(DocumentFile file, String data) throws FileNotFoundException { |
| 160 | + byte[] stringBuffer = data.getBytes(); |
| 161 | + writeDataToFile(file, stringBuffer); |
| 162 | + } |
| 163 | + |
| 164 | + public void writeDataToTimeStampedFile(String mimeType, String data, String extension, boolean inCache) throws FileNotFoundException { |
| 165 | + DocumentFile appDir = getAppDirectory(inCache); |
| 166 | + String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension; |
| 167 | + String fileName = System.currentTimeMillis() + fileExtension; |
| 168 | + writeDataToFile(appDir, fileName, data, mimeType); |
| 169 | + } |
| 170 | + |
| 171 | + public void writeDataToTimeStampedFile(String mimeType, byte[] data, String extension, boolean inCache) throws FileNotFoundException { |
| 172 | + DocumentFile appDir = getAppDirectory(inCache); |
| 173 | + String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension; |
| 174 | + String fileName = System.currentTimeMillis() + fileExtension; |
| 175 | + writeDataToFile(appDir, fileName, data, mimeType); |
| 176 | + } |
| 177 | + |
| 178 | + public void writeDataToTimeStampedFile(String mimeType, String data, String extension, boolean inCache, DocumentFile parent) throws |
| 179 | + FileNotFoundException { |
| 180 | + String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension; |
| 181 | + String fileName = System.currentTimeMillis() + fileExtension; |
| 182 | + writeDataToFile(parent, fileName, data, mimeType); |
| 183 | + } |
| 184 | + |
| 185 | + public void writeDataToTimeStampedFile(String mimeType, byte[] data, String extension, boolean inCache, DocumentFile parent) throws |
| 186 | + FileNotFoundException { |
| 187 | + String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension; |
| 188 | + String fileName = System.currentTimeMillis() + fileExtension; |
| 189 | + writeDataToFile(parent, fileName, data, mimeType); |
| 190 | + } |
| 191 | + |
| 192 | + private DocumentFile createFile(String fileName, boolean inCache, String mimeType) { |
| 193 | + return createFile(fileName, getAppDirectory(inCache), mimeType); |
| 194 | + } |
| 195 | + |
| 196 | + private DocumentFile createFile(String fileName, DocumentFile parent, String mimeType) { |
| 197 | + return parent.createFile(mimeType, fileName); |
| 198 | + } |
| 199 | + |
| 200 | + public DocumentFile getAppDirectory(boolean inCache) { |
| 201 | + return (inCache) ? this.appCacheDirectory : this.appDirectory; |
| 202 | + } |
| 203 | + |
| 204 | +} |
0 commit comments