2017-10-08 25 views
0

urlからファイルをダウンロードして一般的なダウンロードフォルダに保存しようとしています。 setDestinationInExternalPublicDir()は機能せず、例外もスローされません。しかし、setDestinationInExternalFilesDir()は問題なく動作します。どのような理由が考えられるのでしょうか?setDestinationInExternalFilesDir()が動作しないsetDestinationInExternalPublicDir()does not

webView.setDownloadListener(new DownloadListener() { 
    @Override 
    public void onDownloadStart(String url, String userAgent, 
           String contentDisposition, String mimeType, 
           long contentLength) { 

     if (url.startsWith("data:")) { 
      save(url); 
      return; 
     } 


     DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
     request.setMimeType(mimeType); 
     String cookies = CookieManager.getInstance().getCookie(url); 
     request.addRequestHeader("cookie", cookies); 
     request.addRequestHeader("User-Agent", userAgent); 
     request.setDescription(getResources().getString(R.string.downloadingMsg)); 
     String filename = URLUtil.guessFileName(url, contentDisposition, mimeType); 
     request.setTitle(filename); 
     request.allowScanningByMediaScanner(); 
     request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
//DOESN'T WORK 
      request.setDestinationInExternalPublicDir("Downloads", filename); 
//WORKS 
      //request.setDestinationInExternalFilesDir(getApplicationContext(), "Downloads", filename); 
     DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 
     dm.enqueue(request); 
     Toast.makeText(getApplicationContext(), R.string.downloadingMsg, Toast.LENGTH_LONG).show(); 
    } 
}); 

とマニフェストファイル:URLからダウンロード画像の

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

https://stackoverflow.com/questions/32635704/ android-permission-doesnt-work-even-if-i-have-declared-it – CommonsWare

答えて

0

私のソリューション

私のコードは次のようです。

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.media.MediaScannerConnection; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Environment; 
import android.provider.CalendarContract; 
import android.util.Log; 
import android.widget.Toast; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.URL; 
import java.util.UUID; 

public class DownloadImage extends AsyncTask<String, Void, Bitmap> implements MediaScannerConnection.MediaScannerConnectionClient { 

    private Context context; 
    private File mFile; 
    private MediaScannerConnection mMs; 


    public DownloadImage(Context context) { 
     this.context = context; 
    } 

    private Bitmap downloadImageBitmap(String sUrl) { 
     Bitmap bitmap = null; 
     try { 
      InputStream inputStream = new URL(sUrl).openStream(); // Download Image from URL 
      bitmap = BitmapFactory.decodeStream(inputStream);  // Decode Bitmap 
      inputStream.close(); 
     } catch (Exception e) { 
      Log.d(TAG, "Exception 1, Something went wrong!"); 
      e.printStackTrace(); 
     } 
     return bitmap; 
    } 

    @Override 
    protected Bitmap doInBackground(String... params) { 
     return downloadImageBitmap(params[0]); 
    } 

    protected void onPostExecute(Bitmap result) { 
     String fileName = UUID.randomUUID().toString(); 
     getFilePath(fileName + ".jpg", result, context); 
    } 


    public void getFilePath(String name, Bitmap bitmap2, Context context) { 
     Bitmap bitmap = bitmap2; 
     String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();//Downloads folder path 
     File myDir = new File(root); 
     myDir.mkdirs(); 
     String fname = name.replaceAll("-", ""); 
     File file = new File(myDir, fname); 
     if (file.exists()) { 
      file.delete(); 
     } 
     try { 
      FileOutputStream out = new FileOutputStream(file); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      Toast.makeText(context, "Error occurred", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     Toast.makeText(context, "Success", Toast.LENGTH_SHORT).show(); 

     mFile = file; 
     mMs = new MediaScannerConnection(context, this);//finding image in gallery after download 
     mMs.connect(); 

    } 

    @Override 
    public void onMediaScannerConnected() { 
     mMs.scanFile(mFile.getAbsolutePath(), null); 
    } 

    @Override 
    public void onScanCompleted(String path, Uri uri) { 
     mMs.disconnect(); 
    } 
} 

活動で、このクラスの実行:

DownloadImage downloadImage = new DownloadImage(this); 
downloadImage.execute("url"); 

UPD1: 私はあなたがこのコードをダウンロードするファイルに使用することができると思います。

+0

私はAsyncTaskも使用していますが、アクセス権が拒否されています – Elnoor

1

だから、私は最終的にsetDestinationInExternalPublicDir()関数の仕事を得ることができました。 CommonsWareに感謝します。 Commonswareのコメントと回答に続いて、hereは、マニフェストファイルで宣言されているアクセス許可であっても、アンドロイドバージョン6以降で実行時に要求される必要があることを知りました。そして、私はアンドロイド7と一緒に働いていたと思う...それは方法です、私はエラーを拒否されて取得しています。

だから私は(最終的には私の問題を解決しました)だけでなく、実行時に許可をユーザーに求めます私のonCreate()機能にこれらの行を追加しました:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
     int PERMISSION_REQUEST_CODE = 1; 
     if (ContextCompat.checkSelfPermission(MainActivity.this, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
      } else { 
       ActivityCompat.requestPermissions(MainActivity.this, 
         new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
         PERMISSION_REQUEST_CODE); 
      } 
     } 
    }