2016-10-17 10 views
5

私はアンドロイドのカメラから画像を保存する必要があります。 iは、マニフェスト内の書き込み外部記憶許可を使用し、私の代わりにmkdirsのiもMKDIRを試みアンドロイドmkdirsが動作しない

File dir = new File(Environment.getExternalStorageDirectory(), "Test"); 
if (!dir.exists() || !dir.isDirectory()) 
    dir.mkdirs(); 

String path = dir.getAbsolutePath(); 
Log.d(TAG, path);      //log show the path 
File file = new File(dir.getAbsolutePath() + "/Pic.jpg"); 
Log.d(TAG, file.getAbsolutePath()); //again path is shown here 

outStream = new FileOutputStream(file); 
outStream.write(bytes); 
outStream.close(); 
Log.d(TAG, "onPictureTaken - wrote bytes: " + bytes.length); //fail here 
} catch (FileNotFoundException e) { 
Log.d(TAG, "not done");      //error is here (this exception is thrown) 
} catch (IOException e) { 
Log.d(TAG, "not"); 
} finally { } 

このコード()()と同じ結果を使用しています。

コード内で何が問題になったのでしょうか?

ありがとう

+3

おそらく[実行時の権限は実装されていません](https://stackoverflow.com/questions/32635704/android-permission-それでも私が持っていることはありません)。それを超えて、**それを記録せずに例外を捕まえることはありません**。 Log.d() 'コールに' e'を3番目のパラメータとして追加し、LogCatを使ってクラッシュに関連するJavaスタックトレースを調べます。 – CommonsWare

+0

スタックトレースを表示できますか? – ToYonos

+1

'if(!dir.exists()||!dir.isDirectory()) dir.mkdirs();'。悪いコードの良い例。最初にディレクトリではない場合、mkdirsはそのファイルをディレクトリに変換しません。次に、mkdirsの戻り値が失敗する可能性があるので、それをチェックする必要があります。途中でやったの – greenapps

答えて

17

私のような経験がない方に。私はこの問題と戦って、しばらくの間髪の毛を失った。私は互換性のためにapi 21をターゲットにしており、ロリポップで動作しましたが、marshmallowではディレクトリを作成しませんでした。私はマニフェストで "使用"権限を持っていましたが、それでも動作しませんでした。どうやらMarshmallowではAndroidスタジオと一緒にインストールすると、許可しないと拒否したように静かに失敗するかどうか尋ねることはありません。あなたは設定、アプリケーションに入り、アプリケーションを選択して権限スイッチをオンにする必要があります。

+2

これを試してみてください。stackoverflow.com/a/41221852/5488468 –

+0

@RobbyPatelありがとうこの。それは魅力のように働いた。私は2つのアクセス許可が必要かどうか質問があります(ストレージとカメラを言うことができます)。私はこのコードを使用してパーミッションをチェックし、最初のものをチェックしますが、もう一方をチェックしません。それを行う方法はありますか? – lallous34

+0

は配列にパーミッションを入れることができますか? –

0

あなたはファイルではなくディレクトリを作成しました。次のコードで新しいファイルを作成してください

File file = new File(dir.getAbsolutePath() + "/Pic.jpg"); 
file.createNewFile() 
+0

返信のためのthx /あなたのコードごとにファイルを作成しましたが、ファイルの代わりにIOExceptionを除きます。 – lallous34

+0

これは、ファイルへの書き込み中に何らかのエラーが発生したことを意味します。 –

+0

PS:アンドロイドでファイルを閲覧すると、ディレクトリが作成されない(これが問題の一部であるかどうかは分かりません) – lallous34

0

これを試してください。 marshmallowの実行時のアクセス許可を提供してください。私のアプリケーションコードでは完全に動作します。

2

IDIOT ME!私はマニフェストパーミッションを使用していますが、電話にアプリをインストールすると、ストレージの許可をしなかったのです... ...私はこの質問に否定的なことを理解しています...しかし、誰かが同じように直面していれば願っています。不便をおかけして申し訳ありません。

1

アンドロイドMでテストしている場合は、[設定]> [アプリケーション]> [権限]をチェックして、記憶領域へのアクセス権が付与されているかどうかを確認する必要があります。これは私を救った。あなたのAndroidManifestに

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

1

を入れましたか?アンドロイドMを使用している場合は、sdへの書き込みをユーザに許可する必要があります。example

関連する問題