2013-05-03 2 views
5

Мне нужно скопировать файл из активов во внешнее хранилище. Вот мой код:Разрешение отклонено при создании нового файла на внешнем хранилище

File f = new File(Environment.getExternalStorageDirectory() + File.separator 
      + "MyApp" + File.separator + "tessdata" + File.separator + "eng.traineddata"); 
    if (!f.exists()) { 
    AssetManager assetManager = getAssets(); 
    try { 
     f.createNewFile(); 
     InputStream in = assetManager.open("eng.traineddata"); 
     OutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory() + File.separator 
      + "MyApp" + File.separator + "tessdata" + File.separator + "eng.traineddata"); 
     byte[] buffer = new byte[1024]; 
     int read; 
      while ((read = in.read(buffer)) != -1) 
        out.write(buffer, 0, read); 
      in.close(); 
      in = null; 
      out.flush(); 
      out.close(); 
      out = null; 
     } catch (IOException e) { 
      Log.e("tag", "Failed to copy asset file: ", e); 
     } 
    } 

Я также добавил разрешение в manifet

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

произошло исключение при выполнении f.createNewFile(), говоря: «Отказано в доступе».

Как я могу исправить это, пожалуйста?

+1

Что делать, если вы используете приложение? 'Файл f = новый файл (getExternalFilesDir (null)," eng.traineddata ");' – rciovati

+1

Подключено ли ваше устройство к ПК и установлено в режим Mass Storage? Или иначе в каком-то несмонтированном состоянии? Если это так, то у него не будет доступа к внешней файловой системе. – FoamyGuy

ответ

6

ли f.mkdirs() перед тем f.createNewFile(). Вероятно, вы пытаетесь создать новый файл в несуществующем каталоге

+0

Черт! Я тупой ... Ты прав, спасибо! –

1

попробовать это:

private void copy() { 

File dirOri = new File(Environment.getExternalStorageDirectory() +"/somefolder/somefile"); 
File dirDest = new File(Environment.getExternalStorageDirectory() + "/yourfolder"); 

FileChannel src = null; 
FileChannel dst = null; 

try { 
    src = new FileInputStream(dirOri).getChannel(); 
    dst = new FileOutputStream(dirDest).getChannel(); 
    dst.transferFrom(src, 0, src.size());    
    src.close(); 
    dst.close(); 
} catch (Exception e) {} 
} 

- EDIT -

Добавить в манифесте:

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

В моем случае это было связано с всплывающим окном Permissions, требуемым для API 23+, даже если у вас добавлено разрешение в манифесте.

// Storage Permissions 
private static final int REQUEST_EXTERNAL_STORAGE = 1; 
private static String[] PERMISSIONS_STORAGE = { 
     Manifest.permission.READ_EXTERNAL_STORAGE, 
     Manifest.permission.WRITE_EXTERNAL_STORAGE 
}; 

/** 
* Checks if the app has permission to write to device storage 
* 
* If the app does not has permission then the user will be prompted to grant permissions 
* 
* @param activity 
*/ 
public static void verifyStoragePermissions(Activity activity) { 
    // Check if we have write permission 
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    if (permission != PackageManager.PERMISSION_GRANTED) { 
     // We don't have permission so prompt the user 
     ActivityCompat.requestPermissions(
       activity, 
       PERMISSIONS_STORAGE, 
       REQUEST_EXTERNAL_STORAGE 
     ); 
    } 
} 

Вызовите эту функцию, когда приложение запускается или когда вам нужно разрешение.

AndroidManifest.xml

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

Подробный пример кода доступа может быть найден here.