Android Wear: сохранить файл локально

Можно ли сохранить файл в носимых? Я пробую ту же процедуру, которую использую на телефоне, но java.io отправил мне исключение.

        File directory = null;

        File sd = Environment.getExternalStorageDirectory();
        String path = sd.getAbsolutePath();

        directory = new File(path, dirName);

        if (!directory.exists()) {
            directory.mkdirs();
        }

        File file = null;
        String extension = ".arff";
        String completeName = fileName + extension;

        try {
            file = new File(directory, completeName);
            if(!file.isFile())
                file.createNewFile();
            else {

                String[] parts = fileName.split("_");
                String baseName = parts[0];
                String num = parts[1];
                int i = Integer.parseInt(num);
                do{

                    String newFileName = baseName+"_"+(i+1)+extension;
                    file = new File(directory, newFileName);
                    i++;

                } while(file.isFile());

                file.createNewFile();
            }
        } catch (IOException e) {
            Log.e("ERROR", "Exception while creating file:" + e.toString());
        }

Должен ли я писать на внутреннем или внешнем хранилище? Можно ли получить этот файл?

заранее спасибо

2 ответа

Я дам вам пример, чтобы сохранить изображение и получить его обратно.

2 способа сохранить:

private void saveBitmapIntoDevice(Bitmap bitmap, String imageName) {
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(getOutputMediaFile(imageName));
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
        // PNG is a lossless format, the compression factor (100) is ignored
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private File getOutputMediaFile(String imageName){

    File mediaStorageDir = new File(this.getExternalFilesDir(null)
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files");

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    }

    File mediaFile;
    String mImageName="IMG_" + imageName + ".png";
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
    return mediaFile;
}

Как вернуть данные:

                    File imgFile = getOutputMediaFile(imageName);

                    if(imgFile.exists()){
                        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                        image2.setImageBitmap(myBitmap);
                    }

Похоже, износ не поддерживает getExternalStorageDirectory(); mkdirs() звонить как твой тоже не получается. Я могу предположить, что, поскольку хранилище на носимых устройствах имеет тенденцию быть довольно ограниченным, Google хочет ограничить его каталогами, которые будут автоматически удаляться при удалении вашего приложения. С getExternalStorageDirectory(), нет никаких гарантий этого. Но это только предположение.:^)

У вас есть причина использовать этот устаревший метод? Есть много новых вызовов API, которые отлично работают на Wear. Одним из примеров является Context.getExternalFilesDir(), Если вам действительно нужно внешнее хранилище, это замена для вашего getExternalStorageDirectory() вызов.

Но также стоит отметить, что на носимых устройствах идея внешнего хранилища находится на довольно шаткой почве. Ни одно из существующих устройств Wear не поддерживает SD-карты, а многие даже не поддерживают USB-соединение, которое потребуется для их подключения к компьютеру. В качестве документации для getExternalFilesDir говорит,

Если совместно используемое устройство хранения данных эмулируется (как определено isExternalStorageEmulated(File)), его содержимое поддерживается частным разделом пользовательских данных, что означает, что хранить данные здесь будет мало пользы вместо частных каталогов, возвращаемых getFilesDir() и т. Д.,

Я бы порекомендовал просмотреть справочную страницу "Параметры хранилища", подумать, что именно нужно вашему приложению с точки зрения хранилища, и использовать один из новых, более сфокусированных вызовов.

Другие вопросы по тегам