Скачать видео с URL в kotlin Android? - PullRequest
0 голосов
/ 14 января 2019

Я хочу скачать видео с URL. но это выдает ошибку:

E / ContentProviderNative: ошибка onTransact от {P: 12600; U: 11003} 2019-01-14 11: 54: 35.423 3518-22398 /? E / DatabaseUtils: запись исключения в посылку java.lang.IllegalArgumentException: неизвестный URI: content: // downloads / public_downloads / 6796 на com.android.providers.downloads.DownloadProvider.query (DownloadProvider.java:914) на android.content.ContentProvider.query (ContentProvider.java:1138) на android.content.ContentProvider.query (ContentProvider.java:1230) на android.content.ContentProvider $ Transport.query (ContentProvider.java:251) на android.content.ContentProviderNative.onTransact (ContentProviderNative.java:112) на android.os.Binder.execTransact (Binder.java:752) enter image description here

код для загрузки видеофайла ниже: частный var downloadReference: Long = 0 частный lateinit var downloadManager: DownloadManager

private val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action
        if (action == DownloadManager.ACTION_DOWNLOAD_COMPLETE) {
            val downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
            if (downloadId != downloadReference) {
                context.unregisterReceiver(this)
                return
            }
            val query = DownloadManager.Query()
            query.setFilterById(downloadReference)
            val cursor = downloadManager.query(query)
            cursor?.let {
                if (cursor.moveToFirst()) {
                    val columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)
                    if (DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(columnIndex)) {
                        var localFile = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))

                        if (localFile.contains("file:///")) {
                            localFile = localFile.removePrefix("file:///").substringBeforeLast(File.separator)
                        }
                        //context.toast(context.resources.getString(R.string.saved, localFile), Toast.LENGTH_LONG)

                    } else if (DownloadManager.STATUS_FAILED == cursor.getInt(columnIndex)) {
                      //  val message = context.resources.getString("error : ", cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)))
                        //context.toast(message, Toast.LENGTH_LONG)
                    }
                }
                cursor.close()
            }

            context.unregisterReceiver(this)

        }
    }
}

/////////// New Testing........
fun downloadFile(url: String, mimeType: String? = null) {

    val guessFileName = URLUtil.guessFileName(url, null, mimeType)
    System.out.println("LLLLLLLLLLLLLLLLLLL2 ");
   // Timber.d("mimeType -> $mimeType guessFileName -> $guessFileName created by url -> $url")

    val context = this

    downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager

    val downloadUri = Uri.parse(url)

    val request = DownloadManager.Request(downloadUri)
    request.apply {
        setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE or DownloadManager.Request.NETWORK_WIFI)
        //setAllowedOverRoaming(true)
        setTitle(guessFileName)
        setDescription(guessFileName)
        setVisibleInDownloadsUi(true)
        allowScanningByMediaScanner()
        setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)

        //request.setDestinationUri(Uri.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)))
        setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, guessFileName)

        context.registerReceiver(receiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))

        downloadReference = downloadManager.enqueue(this)
    }
    System.out.println("LLLLLLLLLLLLLLLLLLL23 ");
}

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

использовать ниже библиотеки:

  implementation 'com.mindorks.android:prdownloader:0.5.0'

код для скачивания видео с данного URL ниже:

 fun downfile(urll:String,fileName:String){



    if(!isFilePresent(fileName)) {
        var mFile2: File? = File(Environment.getExternalStorageDirectory(), "WallpapersBillionaire")
        System.out.println("File Foond " + mFile2!!.absolutePath)
        var mFile3: File? = File(Environment.getExternalStorageDirectory(), "WallpapersBillionaire")

        var downloadId = PRDownloader.download(urll, mFile2!!.absolutePath, fileName)
                .build()
                .setOnStartOrResumeListener(object : OnStartOrResumeListener {
                    override fun onStartOrResume() {
                        System.out.println("??????????????????? start")
                    }
                })
                .setOnPauseListener(object : OnPauseListener {
                    override fun onPause() {
                    }
                })
                .setOnCancelListener(object : OnCancelListener {
                    override fun onCancel() {
                    }
                })
                .setOnProgressListener(object : OnProgressListener {
                    override fun onProgress(progress: Progress) {
                        circlePeView.visibility = View.VISIBLE

                        var per = (progress.currentBytes.toFloat() / progress.totalBytes.toFloat()) * 100.00
                        //var perint = per*100
                        System.out.println("::??????????????????? Per : " + per + " ?? : " + progress.currentBytes + " ?? : " + progress.totalBytes)

                        circlePeView.setProgress(per.toInt())
                    }
                })
                .start(object : OnDownloadListener {
                    override fun onDownloadComplete() {

                        circlePeView.visibility = View.GONE
                        circlePeView.setProgress(0)
                        prefs = getSharedPreferences(PREFS_FILENAME, 0)

                        val editor = prefs!!.edit()
                        editor.putString(wall, "WallpapersBillionaire/" + fileName)
                        editor.apply()

                        try {
                            val myWallpaperManager = WallpaperManager.getInstance(applicationContext)
                            try {
                                myWallpaperManager.setResource(R.raw.wallp)
                            } catch (e: IOException) {
                                // TODO Auto-generated catch block
                                e.printStackTrace()
                            }

                            val intent = Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER)
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                            intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
                                    ComponentName(this@AnimattedViewpagerActivity, VideoLiveWallpaperService::class.java))
                            startActivity(intent)
                        } catch (e: Exception) {
                            val intent = Intent()
                            intent.setAction(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER)
                            try {
                                startActivity(intent)
                            }catch (e2: java.lang.Exception){
                                Toast.makeText(applicationContext,"Please long click on your home screen. Select Video Live Wallpapers form thier. Thanks",Toast.LENGTH_LONG).show()
                            }

                        }
                        System.out.println("??????????????????? complete")
                    }

                    override fun onError(error: Error) {
                        System.out.println("??????????????????? error " + error)
                    }
                })
        System.out.println("??????????????????? called")
    }else{
        System.out.println("File Foond ")
        circlePeView.visibility = View.GONE
        circlePeView.setProgress(0)
        prefs = getSharedPreferences(PREFS_FILENAME, 0)

        val editor = prefs!!.edit()
        editor.putString(wall, "WallpapersBillionaire/" + fileName)
        editor.apply()

        try {
            val myWallpaperManager = WallpaperManager.getInstance(applicationContext)
            try {
                myWallpaperManager.setResource(R.raw.wallp)
            } catch (e: IOException) {
                // TODO Auto-generated catch block
                e.printStackTrace()
            }

            val intent = Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
                    ComponentName(this@AnimattedViewpagerActivity, VideoLiveWallpaperService::class.java))
            startActivity(intent)
        } catch (e: Exception) {
            val intent = Intent()
            intent.setAction(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER)

            try {
                startActivity(intent)
            }catch (e2: java.lang.Exception){
                Toast.makeText(applicationContext,"Please long click on your home screen. Select Video Live Wallpapers form thier. Thanks",Toast.LENGTH_LONG).show()
            }

        }
        System.out.println("??????????????????? complete")
    }
}
0 голосов
/ 14 января 2019

1) Менеджер загрузок

Android Download Manager был представлен в Android 2.3 как сервис для оптимизации обработки длительных загрузок.

Download Manger обрабатывает HTTP-соединение и отслеживает изменения подключения. Полезно использовать Download.

Менеджер в большинстве ситуаций, особенно когда загрузка может продолжаться в фоновом режиме между сеансами пользователя.

Экземпляры этого класса должны быть получены через getSystemService (String), передав DOWNLOAD_SERVICE.

Приложения, запрашивающие загрузки через этот API, должны зарегистрировать приемник широковещания для ACTION_NOTIFICATION_CLICKED, чтобы соответствующим образом обрабатывать, когда пользователь нажимает на текущую загрузку в уведомлении или в пользовательском интерфейсе загрузок.

2) Запуск службы на переднем плане

Служба переднего плана - это служба, которая считается тем, о чем пользователь активно осведомлен, и, таким образом, не является кандидатом в систему для уничтожения при нехватке памяти. Служба переднего плана должна предоставлять уведомление для строки состояния, которая помещается под заголовком «Постоянно», что означает, что уведомление нельзя отклонить, если служба не остановлена ​​или не удалена с переднего плана.

Например, для загрузки видео из службы должна быть задана функция запуска на переднем плане, поскольку пользователь явно осведомлен о ее работе. Уведомление в строке состояния может указывать текущую загрузку и позволять пользователю запускать действие для взаимодействия с процессом загрузки.

Чтобы запросить, чтобы ваша служба работала на переднем плане, вызовите startForeground (). Этот метод принимает два параметра: целое число, которое однозначно идентифицирует уведомление, и уведомление для строки состояния.

У меня есть видеофайл (формат .MP4), и я хочу позволить пользователю иметь возможность загружать видео на свою SD-карту. В настоящее время я использую этот код, но он не работает ..

String PATHSdcard = "/sdcard/Video/";  

public void DownloadFromUrl(String VideoURL, String fileName)         


try { URL url = new URL("https://javmed-prod.s3.amazonaws.com/666034cbe81045f2a2da50e5205e376b.mp4");
         File file = new File(fileName);

         long sTime = System.currentTimeMillis();
         URLConnection URLcon = url.openConnection();

         InputStream is = URLcon.getInputStream();
         BufferedInputStream bis = new BufferedInputStream(is);

         ByteArrayBuffer baf = new ByteArrayBuffer(50);
         int current = 0;
         while ((current = bis.read()) != -1) {
                 baf.append((byte) current);
         }

         FileOutputStream fos = new FileOutputStream(PATHSdcard+file);
         fos.write(baf.toByteArray());
         fos.close();

 } catch (IOException e) {
         Log.d("ERROR.......",e+"");
 }

    import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;


public class VideoSaveSDCARD extends Activity{

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ProgressBack PB = new ProgressBack();
        PB.execute("");
    }

    private class ProgressBack extends AsyncTask<String,String,String> {
         ProgressDialog PD;
        @Override
        protected void onPreExecute() {
            PD= ProgressDialog.show(LoginPage.this,null, "Please Wait ...", true);
            PD.setCancelable(true);
        }

        @Override
        protected void doInBackground(String... arg0) {
        downloadFile("http://beta-vidizmo.com/hilton.mp4","Sample.mp4");            

        }
        protected void onPostExecute(Boolean result) {
            PD.dismiss();

        }

    }



    private void downloadFile(String fileURL, String fileName) {
        try {
        String rootDir = Environment.getExternalStorageDirectory()
                + File.separator + "Video";
           File rootFile = new File(rootDir);
           rootFile.mkdir();
            URL url = new URL(fileURL);
            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            FileOutputStream f = new FileOutputStream(new File(rootFile,
                    fileName));
            InputStream in = c.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = in.read(buffer)) > 0) {
                f.write(buffer, 0, len1);
            }
            f.close();
    } catch (IOException e) {
        Log.d("Error....", e.toString());
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...