質問
ファイルを次の場所に保存しようとしています
FileOutputStream fos = new FileOutputStream("/sdcard/Wallpaper/"+fileName);
しかし、私は例外を取得しています java.io.FileNotFoundException
ただし、パスを次のように置くと、 "/sdcard/"
それは動作します。
この方法ではディレクトリを自動的に作成できないと思います。
誰かが作成方法を提案してもらえますか directory and sub-directory
コードを使用していますか?
解決
を作成する場合は、 ファイル 最上位のディレクトリをラップするオブジェクト。 mkdirs() 必要なすべてのディレクトリを構築するメソッド。何かのようなもの:
// create a File object for the parent directory
File wallpaperDirectory = new File("/sdcard/Wallpaper/");
// have the object build the directory structure, if needed.
wallpaperDirectory.mkdirs();
// create a File object for the output file
File outputFile = new File(wallpaperDirectory, filename);
// now attach the OutputStream to the file object, instead of a String representation
FileOutputStream fos = new FileOutputStream(outputFile);
注記: 利用するのが賢明かもしれません 環境.get外部ストレージディレクトリ() 「SD カード」ディレクトリを取得するためのものです。これは、SD カード以外のもの (iPhone のような内蔵フラッシュなど) を搭載した携帯電話が登場した場合に変更される可能性があるためです。いずれにしても、SD カードが取り外されている可能性があるため、SD カードが実際に存在するかどうかを確認する必要があることに注意してください。
アップデート: API レベル 4 (1.6) 以降は、権限をリクエストする必要もあります。(マニフェスト内で) 次のようなものが機能するはずです。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
他のヒント
同じ問題を抱えていただけのAndroidManifest.xmlにもこの権限を必要としていることを追加したい:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
ここでは私のためにどのような作品です。
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
あなたのマニフェストのと
以下のコードpublic static boolean createDirIfNotExists(String path) {
boolean ret = true;
File file = new File(Environment.getExternalStorageDirectory(), path);
if (!file.exists()) {
if (!file.mkdirs()) {
Log.e("TravellerLog :: ", "Problem creating Image folder");
ret = false;
}
}
return ret;
}
実は私は@fiXeddの答えの一部を使用し、それが私のために働いてます:
//Create Folder
File folder = new File(Environment.getExternalStorageDirectory().toString()+"/Aqeel/Images");
folder.mkdirs();
//Save the path as a string value
String extStorageDirectory = folder.toString();
//Create New file and name it Image2.PNG
File file = new File(extStorageDirectory, "Image2.PNG");
の完全なパスを作成するには、あなたはmkdirsを(使用していることを確認してください)ないMKDIR()
はAPI 8と大きくすると、SDカードの位置が変更されました。 fiXeddの答え@良いですが、より安全なコードのために、あなたはメディアが利用可能であるかどうかを確認するためにEnvironment.getExternalStorageState()
を使用する必要があります。次に、あなたがしたいディレクトリ(あなたがAPI 8以上を使用していると仮定した場合)に移動しgetExternalFilesDir()
を使用することができます。
あなたは SDKドキュメントで続きを読むことができますするます。
ことを確認した外部記憶装置が存在します。 http://developer.android.com/guide/topics/data/data-storage。 htmlの#filesExternalする
private boolean isExternalStoragePresent() {
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Something else is wrong. It may be one of many other states, but
// all we need
// to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
if (!((mExternalStorageAvailable) && (mExternalStorageWriteable))) {
Toast.makeText(context, "SD card not present", Toast.LENGTH_LONG)
.show();
}
return (mExternalStorageAvailable) && (mExternalStorageWriteable);
}
あなたがあなたのファイル/フォルダ名に特殊文字を持っていないことを確認することを忘れないでください。私に起こった「:」私は、変数(複数可)を使用してフォルダ名を設定したとき、
ファイル/フォルダ名で許可されていない文字
」* / <?> \ |
Uは、Aの場合には、このコードは参考にしてもよい。
「:」コードの下には、すべてを削除し、それらを置き換える「 - 」
//actualFileName = "qwerty:asdfg:zxcvb" say...
String[] tempFileNames;
String tempFileName ="";
String delimiter = ":";
tempFileNames = actualFileName.split(delimiter);
tempFileName = tempFileNames[0];
for (int j = 1; j < tempFileNames.length; j++){
tempFileName = tempFileName+" - "+tempFileNames[j];
}
File file = new File(Environment.getExternalStorageDirectory(), "/MyApp/"+ tempFileName+ "/");
if (!file.exists()) {
if (!file.mkdirs()) {
Log.e("TravellerLog :: ", "Problem creating Image folder");
}
}
私も同じ問題に直面しました。Android には 2 種類の権限があります。
- 危険な (連絡先へのアクセス、外部ストレージへの書き込み...)
- 普通 (通常の権限は Android によって自動的に承認されますが、危険な権限は Android ユーザーが承認する必要があります。)
Android 6.0で危険な権限を取得する戦略は次のとおりです
- 許可が与えられているかどうかを確認してください
- アプリにすでに許可が付与されている場合は、そのまま通常どおり実行してください。
- アプリにまだ権限がない場合は、ユーザーに承認を求めます
- ユーザーの承認を聞く
onRequestPermissionsResult
私の場合は次のとおりです。外部ストレージに書き込む必要があります。
まず、権限があるかどうかを確認します。
...
private static final int REQUEST_WRITE_STORAGE = 112;
...
boolean hasPermission = (ContextCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
ActivityCompat.requestPermissions(parentActivity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_STORAGE);
}
次に、ユーザーの承認を確認します。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
{
case REQUEST_WRITE_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
//reload my activity with permission granted or use the features what required the permission
} else
{
Toast.makeText(parentActivity, "The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission", Toast.LENGTH_LONG).show();
}
}
}
}
私は、同じ問題に直面してギャラクシーS上のディレクトリを作成することができませんが、ネクサスとサムスンドロイドで正常にそれを作成することができました。どのように私はそれが次のコード行を追加していた固定ます:
File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/"+getPackageName()+"/");
dir.mkdirs();
File sdcard = Environment.getExternalStorageDirectory();
File f=new File(sdcard+"/dor");
f.mkdir();
これはあなたのSDカードにDORという名前のフォルダを作成します。 その後、手動でのDOR のフォルダに挿入されているEG-filename.jsonのためのファイルを取得します。同様ます:
File file1 = new File(sdcard,"/dor/fitness.json");
.......
.....
<用途許可は、Android:名= "android.permission.WRITE_EXTERNAL_STORAGE" />
とマニフェストの
にコードを追加することを忘れないでください //Create File object for Parent Directory
File wallpaperDir = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() +File.separator + "wallpaper");
if (!wallpaperDir.exists()) {
wallpaperDir.mkdir();
}
File out = new File(wallpaperDir, wallpaperfile);
FileOutputStream outputStream = new FileOutputStream(out);
ビジェイの投稿を完了したところです...
マニフェスト
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
関数
public static boolean createDirIfNotExists(String path) {
boolean ret = true;
File file = new File(Environment.getExternalStorageDirectory(), path);
if (!file.exists()) {
if (!file.mkdirs()) {
Log.e("TravellerLog :: ", "Problem creating Image folder");
ret = false;
}
}
return ret;
}
使用法
createDirIfNotExists("mydir/"); //Create a directory sdcard/mydir
createDirIfNotExists("mydir/myfile") //Create a directory and a file in sdcard/mydir/myfile.txt
エラーをチェックできます
if(createDirIfNotExists("mydir/")){
//Directory Created Success
}
else{
//Error
}
これはあなたが提供するフォルダ名を持つSDカードにフォルダを作成します。
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name");
if (!file.exists()) {
file.mkdirs();
}
あなたが使用することができます/ SDカード/の代わりにEnvironment.getExternalStorageDirectoryの()
private static String DB_PATH = "/sdcard/Android/data/com.myawesomeapp.app/";
File dbdir = new File(DB_PATH);
dbdir.mkdirs();
ivmage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE_ADD);
}
});`