サーバーからファイルをダウンロードしてストレージに保存することで構成される次のコードは、デバイスに内部ストレージがある場合に正常に機能します。
しかし、内部ストレージのないデバイスで試してみたところ、外部ストレージのみで次の例外が発生しました。
Java.io.filenotfoundexception openの失敗したeacces(許可が拒否されました)
public void downloadFile(String dlUrl, String dlName) {
int count;
HttpURLConnection con = null;
InputStream is = null;
FileOutputStream fos = null;
try {
URL url = new URL( dlUrl );
con = (HttpURLConnection) url.openConnection();
con.setDoInput(true);
con.connect();
is = url.openStream();
String dir = Environment.getExternalStorageDirectory() + Util.DL_DIRECTORY;
File file = new File( dir );
if( !file.exists() ){
file.mkdir();
}
Util.LOG_W(TAG, "Downloading: " + dlName + " ...");
fos = new FileOutputStream(file + "/" + dlName);
byte data[] = new byte[1024];
while( (count = is.read(data)) != -1 ){
fos.write(data, 0, count);
}
Util.LOG_D(TAG, dlName + " Download Complete!");
} catch (Exception e) {
Util.LOG_E(TAG, "DOWNLOAD ERROR = " + e.toString() );
bServiceDownloading = false;
}
finally{
try {
if( is != null)
is.close();
if( fos != null)
fos.close();
if( con != null)
con.disconnect();
} catch (Exception e) {
Util.LOG_E(TAG, "CLOSE ERROR = " + e.toString() );
}
}
}
そして、マニフェストファイルには次のものがあります:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
何か提案はありますか?ちなみにEnvironment.getExternalStorageDirectory()は/ mnt/sdcard /を返し、file.mkdir()はfalseを返します。
この問題はいくつかの要因によって引き起こされるようです。
チェック#1
最初にこの許可をマニフェストファイルに追加し、機能しているかどうかを確認します。
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
...
</application>
.....
チェック#2:
エミュレータで実行している場合は、プロパティをチェックして、SDカードがあるかどうかを確認します。
チェック#3:
デバイスからコンピューターへのファイル転送を無効にします。有効の場合、アプリはSDカードにアクセスできません。
チェック#4:
それでも動作しない場合は、次を試してください。
String dir = Environment.getExternalStorageDirectory().getAbsolutePath()
私にとっては、次のように働いた:
問題は、getExternalStorageDirectoryが/ mnt/sdcardを返すのに対し、/ mnt/sdcard-extである外部ストレージの実際のパスが必要であり、Androidに絶対パスを取得できるAPIがないことです。取り外し可能なSDカードの。
私の解決策は、ディレクトリを次のようにハードコーディングすることでした。
String dir = "/mnt/sdcard-ext" ;
このアプリケーションは1つのデバイスでのみ動作することを目的としているため、上記の作業は成功しました。
同じ問題が発生した場合は、 file Explorer application を使用して外部ディレクトリの名前を見つけ、それをハードコーディングします。
使用する READ_EXTERNAL_STORAGE
デバイスからデータを読み取る許可。
エミュレータで試しましたか? SDカードがある場合は、プロパティを確認してください。私も同じ問題を抱えていましたが、それはエミュレータにSDカードがなかったためです。あなたが持っているかどうかを確認してください。
私も同じ問題を抱えていましたが、デバイスからコンピューターへのファイル転送を無効にすることで解決しました。 uがファイル転送を有効にすると、SDカードはデバッグアプリケーションからアクセスできないためです。
try
Environment.getExternalStorageDirectory().getAbsolutePath()
追加することを忘れないでください
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
Mkdirの代わりにmkdirsを使用してみてください。ディレクトリパスを作成していて、親が存在しない場合は、mkdirsを使用する必要があります。
同じ問題がありました。マニフェストで書き込み権限と読み取り権限を正しく使用しましたが、機能しませんでした!解決策は非常にばかげていました。アプリケーションを実行する前にPCから電話機を取り外してください。お使いの携帯電話が「マスストレージ」としてPCに接続されている場合、アプリケーションは外部ストレージにアクセスできません。
デバイスでは、手動で携帯電話に許可を与え、機器を確認し、デバイスで書き込み許可が有効になっていることを確認する必要がある可能性があります。
私は非常に愚かな間違いを犯しました。私はすでにAndroidManifest.xmlに入れています
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
また、Javaファイルに許可を追加します。実際には許可を取得します。しかし、Manifest.permission.READ_EXTERNAL_STORAGEの誤りがあります。Manifest.permission.WRITE_EXTERNAL_STORAGEを使用してください。
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);