2016-03-15 2 views
1

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

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

Должен я писать на внутреннем или внешнем накопителе? Возможно ли получить этот файл?

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

ответ

1

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

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

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

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

Я рекомендовал бы обзор the Storage Options guide page, учитывая то, что это приложение действительно нуждается в плане хранения, и с помощью одного из новых , более целенаправленные вызовы.

4

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

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); 
        } 
Смежные вопросы