2016-07-04 3 views
2

Я пользуюсь ThinDownloadManager библиотекой для скачивания видео от url. Необходимо сделать видео приватным, поэтому мне нравится использовать internal storage для сохранения загружаемого видео, чтобы сделать его приватным. В вышеприведенной библиотеке две вещи, которые мы предоставляем, сначала это URL, а второй - путь для хранения видеофайла. когда я даю внутренний путь, возникает исключение и вызывается метод onDownloadFailed.ava.io.IOException: open failed: EACCES (Permission denied)

Ниже мой код

public void startVideoDownloading() { 
     //Show downloading in notification bar 

     final NotificationManager mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 
     mBuilder.setContentTitle("Video downloading") 
       .setContentText("Download in progress") 
       .setSmallIcon(R.drawable.ic_notification); 

     ThinDownloadManager downloadManager = new ThinDownloadManager(); 
     Uri downloadUri = Uri.parse(videoId); 
     File fileDir = createDirectory(); 
     Uri destinationUri = Uri.parse(fileDir + uniqueId); 
     DownloadRequest downloadRequest = new DownloadRequest(downloadUri) 
       .setDestinationURI(destinationUri).setPriority(DownloadRequest.Priority.HIGH) 
       .setDownloadListener(new DownloadStatusListener() { 
        @Override 
        public void onDownloadComplete(int id) { 
         Toast.makeText(Player.this, "Download Completed", Toast.LENGTH_SHORT).show(); 

         mBuilder.setContentText(" Video download completed") 
           .setProgress(0, 0, false); 
         mNotifyManager.notify(id, mBuilder.build()); 

        } 

        @Override 
        public void onDownloadFailed(int id, int errorCode, String errorMessage) { 
         Toast.makeText(Player.this, "Download Failed", Toast.LENGTH_SHORT).show(); 
         mBuilder.setContentTitle("Failed"); 
         mBuilder.setContentText("Downloading failed") 
           .setProgress(0, 0, false); 
         mNotifyManager.notify(id, mBuilder.build()); 

        } 

        @Override 
        public void onProgress(int id, long totalBytes, long downloadedBytes, int progress) { 
         donutProgress.setProgress(progress); 

         mBuilder.setProgress(100, progress, false); 

         mNotifyManager.notify(id, mBuilder.build()); 

        } 
       }); 
     downloadManager.add(downloadRequest); 
    } 

    public File createDirectory() { 
     File folder = new File(Environment.getDataDirectory() + "/+" + "downloadVideo/"); 
     if (!folder.exists()) { 
      folder.mkdir(); 
      Log.d("TAG","Directory created"); 
     }else { 
      Log.d("TAG","Directory exists"); 
     } 
     return folder; 

    } 

ниже моя ошибка

java.io.IOException: open failed: EACCES (Permission denied) 
at java.io.File.createNewFile(File.java:946) 
at com.thin.downloadmanager.DownloadDispatcher.transferData(DownloadDispatcher.java:213) 
at com.thin.downloadmanager.DownloadDispatcher.executeDownload(DownloadDispatcher.java:142) 
at com.thin.downloadmanager.DownloadDispatcher.run(DownloadDispatcher.java:81) 
0Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) 
at libcore.io.Posix.open(Native Method) 
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
at java.io.File.createNewFile(File.java:939) 

LogCat Когда я обеспечиваю внешний путь хранения работает нормально. Как я могу решить эту проблему?

+0

вам нужно добавить разрешение на запись внутреннего хранилища в манифесте –

+0

@Jinal Я думаю, что нет необходимости добавлять разрешения для записи внутреннего хранилища. Если это необходимо, вы можете предоставить мне такой тип разрешения ? –

+1

ответ

0

Вы, скорее всего, нужно добавить следующую строку в манифесте (как описано здесь: https://developer.android.com/training/basics/data-storage/files.html)

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

Кроме того, если приложение ориентации Android 6.0 или выше, вы должны запросить это разрешение от пользователь во время выполнения - подробно описано здесь: https://developer.android.com/training/permissions/requesting.html

+1

Я уже добавил это разрешение в свой файл манифеста, и я тестирую его API 20 –

Смежные вопросы