2013-05-03 7 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); 
     } 
    } 

私はまた、「アクセス許可が拒否されました」と言って、f.createNewFile()を実行したときに例外が発生しましたmanifet

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

に許可を追加しました。

どうすれば修正できますか?

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

あなたのアプリディレクトリを使用するとどうなりますか? 'File f = new File(getExternalFilesDir(null)、eng.traineddata"); ' – rciovati

+1

あなたのデバイスはPCに接続され、Mass Storageモードに設定されていますか?そうでなければ、アンマウント状態になっていますか?そうであれば、外部ファイルシステムにアクセスすることはできません。 – FoamyGuy

答えて

6

f.createNewFile()f.mkdirs()を行います。 - - 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) {} 
} 

+0

くそー!私はばかです...あなたは正しいですよ! –

1

はこれを試してみてください。存在しないディレクトリに新しいファイルを作成しようとしている可能性があります

12

私の場合は、マニフェストで権限が追加されていても、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を見出すことができます。

関連する問題