2013-05-03 17 views
5

Öğeleri bir dosyadan dış depolama birimine kopyalamam gerekiyor. İşte benim kodudur:Harici depolama biriminde yeni dosya oluşturulduğunda izin reddedildi

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

Ben de "İzin verilmedi" diyerek f.createNewFile() yürütüldüğünde durum oluştu manifet

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

izne ekledik.

Nasıl düzeltebilirim lütfen? EDIT - -

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) {} 
} 

manifest'te ekleyin::

+1

Uygulama direktifini kullanırsanız ne olur? 'Dosya f = yeni Dosya (getExternalFilesDir (null)," eng.traineddata ");' – rciovati

+1

Cihazınız bir PC'ye bağlı ve Yığın Depolama moduna ayarlanmış mı? Ya da başka bir şekilde bağlanmamış durumda? Öyleyse, harici dosya sistemine erişemez. – FoamyGuy

cevap

6

f.createNewFile() önce f.mkdirs() yapın. Var olmayan bir dizinde yeni bir dosya oluşturmaya çalışıyor olabilirsiniz

+0

Lanet olsun! Ben aptalım ... Haklısın sağol! –

1

bu deneyin

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

Durumumda, bildirimde izniniz varsa bile, API 23 + için gerekli olan izinler açılır penceresinden kaynaklanıyordu.

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

Çağrı Bu fonksiyon uygulaması başlattı veya iznine ihtiyaç olduğunda. izinleri

AndroidManifest.xml

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

detaylı örnek kod here bulunabilir.

İlgili konular