web-dev-qa-db-ja.com

デバイスでjava.io.filenotfoundexception openが失敗したeacces(許可が拒否されました)

サーバーからファイルをダウンロードしてストレージに保存することで構成される次のコードは、デバイスに内部ストレージがある場合に正常に機能します。
しかし、内部ストレージのないデバイスで試してみたところ、外部ストレージのみで次の例外が発生しました。

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を返します。

14
Lazy Ninja

この問題はいくつかの要因によって引き起こされるようです。

チェック#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 を使用して外部ディレクトリの名前を見つけ、それをハードコーディングします。

14
Lazy Ninja

使用する READ_EXTERNAL_STORAGEデバイスからデータを読み取る許可。

10
Naresh R

エミュレータで試しましたか? SDカードがある場合は、プロパティを確認してください。私も同じ問題を抱えていましたが、それはエミュレータにSDカードがなかったためです。あなたが持っているかどうかを確認してください。

6
keybee

私も同じ問題を抱えていましたが、デバイスからコンピューターへのファイル転送を無効にすることで解決しました。 uがファイル転送を有効にすると、SDカードはデバッグアプリケーションからアクセスできないためです。

4
toskebre
try
Environment.getExternalStorageDirectory().getAbsolutePath()

追加することを忘れないでください

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
3
brzhang

Mkdirの代わりにmkdirsを使用してみてください。ディレクトリパスを作成していて、親が存在しない場合は、mkdirsを使用する必要があります。

1
Sagar

同じ問題がありました。マニフェストで書き込み権限と読み取り権限を正しく使用しましたが、機能しませんでした!解決策は非常にばかげていました。アプリケーションを実行する前にPCから電話機を取り外してください。お使いの携帯電話が「マスストレージ」としてPCに接続されている場合、アプリケーションは外部ストレージにアクセスできません。

0
gaby

デバイスでは、手動で携帯電話に許可を与え、機器を確認し、デバイスで書き込み許可が有効になっていることを確認する必要がある可能性があります。

私は非常に愚かな間違いを犯しました。私はすでに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);
0
Sanket Sangani