私はこれに夢中です:
_Log.d("STATE", Environment.getExternalStorageState());
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "work_data");
Log.d("PATH", f.getAbsolutePath());
if (!f.exists()) {
Log.d("MAKE DIR", f.mkdirs() + "");
}
_
出力ログは次のようになります。
_STATE mounted
PATH /mnt/sdcard/DCIM/work_data
MAKE DIR false
_
正しい権限を追加するようにしました:
_ <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
_
しかし、フォルダを作成できなかった理由はわかりません。 mkdir()
も段階的に使用しましたが、結果は同じです。私を助けてください。私はそんなにググって、この愚かなことに少なくとも2日を費やしました。ご協力いただきありがとうございます!!
編集:
みんなごめんね! _<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
_タグに_<application>
_を追加しました。これは私の間違いでした!しかし、返信ありがとうございます。
私は同じ問題を抱えていて、答えを見つけるために1週間すべてを検索しました。私はそれを見つけたと思いますし、それは途方もなく簡単だと思います。uses-permissionステートメントを適切な場所に配置する必要があります...
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.company.name"
Android:versionCode="1"
Android:versionName="0.2">
<uses-sdk Android:minSdkVersion="8" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<application> </ application>セクション内で使用した場合、機能しませんでした。
私はこれが古い投稿であることを知っていますが、おそらく私の答えは誰かを助けることができます。
この問題に対処して数日後、電話がPCに接続されている間、それは常に開発中になりますが、SDカードは利用できないことに気付きました。したがって、その上にディレクトリまたはファイルを作成しようとすると失敗します。 「より簡単に」するには、テスト中の電話によって動作が異なるように見えました。
私はそれがかなりばかげた問題に聞こえるかもしれないことを知っています、しかしそれはおそらく他の人が救うことができるであろう多くの時間を要しました。
onCreate()にこのコード行を追加します
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
mkdirs()は、ディレクトリが作成された場合にのみtrueを返します。すでに配置されている場合は、falseを返します。だから私はこのディレクトリがすでに存在しているに違いない。
Android 6.0以上の場合は、22未満のGradleファイルでターゲットSDKを確認してください。
targetSdkVersion 22
または、ランタイム権限を実装する必要があります。
これを入れて
Log.d("MAKE DIR", f.mkdir() + "");
の代わりに
Log.d("MAKE DIR", f.mkdirs() + "");
またはこれを試してください
String s=Environment.getExternalStorageDirectory().toString()+"/";
File f = new File(s+"DCIM/work_data");
あなたのコードは私にとってはうまく機能しています。コードに問題はありません。 1つのディレクトリを作成する場合でも、f.mkdir()
の代わりにf.mkdirs()
を使用します。mnt => Sd card => DCIM => work_data
でフォルダを確認できます
同じ問題があり、修正を共有したかっただけです。 Android Android 4.4で始まるので、アプリのプライベートディレクトリ内のファイルの読み取りまたは書き込みには、READ_EXTERNAL_STORAGEまたはWRITE_EXTERNAL_STORAGE権限は必要ありません。 =
したがって、Android maxSdkVersion属性を追加することにより、Android $ ===の下位バージョンでのみ権限がリクエストされるように宣言できます:
<uses-permission
Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"
Android:maxSdkVersion="18" />
しかし、maxSdkVersionが問題で、削除しただけで機能します。
これは将来誰かを助けるかもしれません。
問題は、代わりに「/ File/Address /」というアドレスを書き込むことかもしれません。
File.separator + "File" + File.separator + "Address" + File.separator
これはとても小さくて愚かなことですが、何時間もの時間を浪費した後、これは私にとってはうまくいきました。
Mkdirs()がfalseを返し続けたときに、外部ストレージ 'Test/Test1/Test2'に一連のサブフォルダーを作成しようとしました。 「Test」は、外部ストレージルート内のフォルダー用に予約されたWordであることがわかります。これはMotorola G(XT1541)を使用していたため、他のデバイスにも適用される可能性があります。
新しいデバイスの場合は、ユーザーに許可を求める必要があります。
ファイルを作成する前に、次のように行うことができます。
boolean hasPermission = (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
if (!hasPermission) {
//ask permission
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_STORAGE);
}
else {
//you have permission, create your file
}
ユーザーのアクションの後で、結果を処理できます。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
{
case 1: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
//you have permission, create your file
//reload my activity with permission granted or use the features what required the permission
} else
{
Toast.makeText(MainActivity.this, "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();
}
}
}
}