androidstudioで画像ダウンロードアプリを作成しています。
URLを入力したらそのURLの画像をダウンロード、画面に表示し、Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
に保存をするアプリです。
画像を画面に表示することはできたのですが、保存することができません。
以下、画像を保存するための関数です。
入力したURLをbitmapでダウンロードし、そのbitmapをこの関数の引数に渡しています。
###該当のソースコード
public void saveToFile(Bitmap bit) { try { File filePath = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"myfile.jpg"); Log.d(TAG,"11111111111111111111"); String path = filePath.getAbsolutePath(); Log.d(TAG,"2222222222222222222222222") Log.d(TAG, "External: " +Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) ); FileOutputStream output = null; Log.d(TAG,"3333333333333"); output = new FileOutputStream(path); Log.d(TAG,"4444444444444444444"); bit.compress(Bitmap.CompressFormat.JPEG, 100, output); Log.d(TAG,"555555555555555555555"); output.close(); Log.d(TAG,"66666666666666666666666"); } catch (Exception e) { Log.d(TAG,"7777777777777777777777"); e.printStackTrace(); } }
###Logcat
05-24 06:09:12.145 2621-2621/com.example.masa_2.sumple D/MainActivity: 11111111111111111111 05-24 06:09:12.145 2621-2621/com.example.masa_2.sumple D/MainActivity: 2222222222222222222222222 05-24 06:09:12.146 2621-2621/com.example.masa_2.sumple D/MainActivity: External: /storage/emulated/0/Download 05-24 06:09:12.146 2621-2621/com.example.masa_2.sumple D/MainActivity: 3333333333333 05-24 06:09:12.147 2621-2621/com.example.masa_2.sumple D/MainActivity: 7777777777777777777777 05-24 06:09:12.147 2621-2621/com.example.masa_2.sumple W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Download/myfile.jpg: open failed: EACCES (Permission denied) 05-24 06:09:12.147 2621-2621/com.example.masa_2.sumple W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452) 05-24 06:09:12.147 2621-2621/com.example.masa_2.sumple W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 05-24 06:09:12.147 2621-2621/com.example.masa_2.sumple W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:127) 05-24 06:09:12.147 2621-2621/com.example.masa_2.sumple W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:116) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at com.example.masa_2.sumple.MainActivity.saveToFile(MainActivity.java:168) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at com.example.masa_2.sumple.MainActivity$2.onPostExecute(MainActivity.java:88) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at com.example.masa_2.sumple.MainActivity$2.onPostExecute(MainActivity.java:72) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at android.os.AsyncTask.finish(AsyncTask.java:651) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at android.os.AsyncTask.-wrap1(AsyncTask.java) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at android.os.Looper.loop(Looper.java:148) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at java.lang.reflect.Method.invoke(Native Method) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at libcore.io.Posix.open(Native Method) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438) 05-24 06:09:12.148 2621-2621/com.example.masa_2.sumple W/System.err: ... 15 more 05-24 06:09:13.184 2621-2621/com.example.masa_2.sumple I/Choreographer: Skipped 38 frames! The application may be doing too much work on its main thread. 05-24 06:09:13.846 1646-1836/system_process W/art: Long monitor contention event with owner method=void com.android.server.wm.WindowAnimator$1.doFrame(long) from WindowAnimator.java:121 waiters=0 for 319ms 05-24 06:09:14.209 1646-1836/system_process W/art: Long monitor contention event with owner method=void com.android.server.wm.WindowAnimator$1.doFrame(long) from WindowAnimator.java:121 waiters=0 for 362ms 05-24 06:09:14.579 1646-1836/system_process W/art: Long monitor contention event with owner method=void com.android.server.wm.WindowAnimator$1.doFrame(long) from WindowAnimator.java:121 waiters=0 for 370ms
###試したこと
Log.dでどこまで実行されているのかを調べました。
このコードですと
Log.d(TAG,"3333333333333");
まで実行されます。
output = new FileOutputStream(path);
の文で例外が発生していると思われます。
原因がわかりますでしょうか?
パーミッションは
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>を許可しています。
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境はandroidstudio2.1
エミュレータ nexus7 APIレベルは23です。
それと、保存するファイル名についてなのですが、このコードではとりあえずmyfile.jpgとなっています。
保存するファイルの名前を入力した画像のURLの画像ファイル名と同じにしたいのですがやり方がわかりません。
例
http://aaaaaaaaa/image.jpg
ならimage.jpgで保存、といった感じです。
わかる方いましたら是非ご教授願います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/25 01:30
2016/05/25 11:25
2016/05/30 00:19