2

ThinDownloadManagerからビデオをダウンロードするためにライブラリを使用していますurl。動画を非公開にする必要があるので、internal storageダウンロードした動画を保存して非公開にするのに使用したいと思います。上記の使用されたライブラリでは、私たちが提供する 2 つのものがあります。1 つ目は URL で、2 つ目はビデオ ファイルを保存するパスです。内部パスを指定すると、例外が発生し、ビデオの onDownloadFailed メソッドが呼び出されます。

以下は私のコードです

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;

    }

以下は私のlogcatエラーです

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)

外部ストレージパスを提供すると、正常に機能します。この問題を解決するにはどうすればよいですか?

4

1 に答える 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

于 2016-07-04T06:52:52.733 に答える