#android #video #android-sdcard #corrupt #corrupt-data
#Android #Видео #android-sdcard #поврежден #поврежденные данные
Вопрос:
я загружаю файл с сервера и сохраняю на sdcard, но иногда файлы для сетевого подключения загружаются не полностью, поэтому я хочу проверить, поврежден видеофайл или нет, если он поврежден, чем удалить этот файл и повторно загрузить с сервера как я могу проверить, поврежден ли видеофайл на sdcard
Поврежден код для проверки изображения
Bitmap bmp =loadResizedBitmap(path, imageWidth, imageHeight, false);
if(bmp!=null)
{
imageview.setImageDrawable(null);
imageview.setImageBitmap(bmp);
}
else
{
// file is corrupt
}
MyDownload.java
public class FirstDownloadFileFromURL extends AsyncTask<String, String, String>
{
@Override
protected void onPreExecute()
{
progressbar.setMax(100);
}
@Override
protected String doInBackground(String... f_url)
{
try
{
String spaceurl=f_url[0];
String newurl=spaceurl.replaceAll(" ", " ");
BufferedOutputStream out = null;
Uri u = Uri.parse(newurl);
File f1 = new File("" u);
String originalurl=f_url[0];
Uri cu = Uri.parse(originalurl);
File f2= new File("" cu);
filename=f2.getName();
Log.i("DownloadFile", "DownloadURL:" newurl.replaceAll(" ", " "));
Log.i("DownloadFile", "filename: " filename);
File SmartAR;
if(ssdcard.equals("true"))
{
root = Environment.getExternalStorageDirectory().getAbsolutePath();
new File(root "/montorwerbung").mkdirs();
SmartAR = new File(root "/montorwerbung", "");
}
else
{
File direct = new File(Environment.getDataDirectory() "/montorwerbung");
if(!direct.exists())
{
if(direct.mkdir()); //directory is created;
}
SmartAR = new File(direct "/montorwerbung", "");
}
Log.i("smart ar", "filename: " SmartAR);
// have the object build the directory structure, if needed.
SmartAR.mkdirs();
// create a File object for the output file
File outputFile = new File(SmartAR, filename);
// now attach the OutputStream to the file object, instead
// of a String representation
FileOutputStream fos = new FileOutputStream(outputFile);
String url1 = newurl;
HttpURLConnection conn = (HttpURLConnection) new URL(url1).openConnection();
conn.setDoInput(true);
conn.connect();
int lenghtOfFile = conn.getContentLength();
final InputStream in = new BufferedInputStream(conn.getInputStream(), 1024); // buffer size
// 1KB
out = new BufferedOutputStream(fos, 1024);
int b;
long total = 0;
byte data[] = new byte[1024];
while ((b = in.read(data)) != -1)
{
total = b;
publishProgress("" (int)((total*100)/lenghtOfFile));
out.write(data,0,b);
}
out.close();
in.close();
conn.disconnect();
} catch (final MalformedURLException e) {
showError("Error : MalformedURLException " e);
e.printStackTrace();
} catch (final IOException e) {
showError("Error : IOException " e);
e.printStackTrace();
}
catch (final Exception e) {
showError("Error : Please Check Your Wifi connection " e);
}
return null;
}
@Override
protected void onProgressUpdate(String... progress)
{
progressbar.setProgress(Integer.parseInt(progress[0]));
textprogressbar.setText(String.valueOf(Integer.parseInt(progress[0]) "%"));
}
@SuppressWarnings("deprecation")
@Override
protected void onPostExecute(String file_url)
{
}
}
Комментарии:
1. что произойдет, если ваше видео повреждено, а вы просто загружаете его в просмотр?
2. извините, это видео не может быть воспроизведено
3. и что в этом такого плохого?
4. поскольку этот файл загружен не полностью, поэтому, если он загружен не полностью, я хочу повторно загрузить этот файл
5. Добавьте
lenghtOfFile
к имени файла, чтобы позже вы могли проверить предполагаемую длину файла. Поэтому открывайте выходной поток только после того, как вы знаете длину.
Ответ №1:
Вот что я сделал
class DownloadAsyncTask extends AsyncTask<String, Integer, String> {
private final String url;
private final String absolutePath;
private int totalSize;
private int downloadedSize;
private ProgressDialog dialog;
public DownloadAsyncTask(String url, String absolutePath) {
this.url = url;
this.absolutePath = absolutePath;
}
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(ParentPageActivity.this );
dialog.setMessage("Downloading Video");
dialog.setTitle("Downloading...");
dialog.setCancelable(true);
dialog.setIndeterminate(false);
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
cancel(true);
}
});
dialog.show();
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() File.separator Constants.ROOT_DIR File.separator Constants.VIDEO_DIRECTORY_NAME, absolutePath);
try {
URL url = new URL(this.url);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
//connect
urlConnection.connect();
//this is the total size of the file which we are downloading
totalSize = urlConnection.getContentLength();
if(file.exists()){
long length = file.length();
if(totalSize > length){
file.delete();
}
else{
return file.getAbsolutePath();
}
}
//create a new file, to save the downloaded file
new File(Environment.getExternalStorageDirectory().getAbsolutePath() File.separator Constants.ROOT_DIR File.separator Constants.VIDEO_DIRECTORY_NAME).mkdirs();
file.createNewFile();
FileOutputStream fileOutput = new FileOutputStream(file);
//Stream used for reading the data from the internet
InputStream inputStream = urlConnection.getInputStream();
//create a buffer...
byte[] buffer = new byte[1024];
int bufferLength;
downloadedSize = 0;
while ((bufferLength = inputStream.read(buffer)) > 0) {
fileOutput.write(buffer, 0, bufferLength);
if(isCancelled()) {
return null;
}
downloadedSize = bufferLength;
publishProgress((int) (downloadedSize * 100) /totalSize);
}
//close the output stream when complete //
fileOutput.close();
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
return null;
}
return file.getAbsolutePath();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
@Override
protected void onCancelled(String s) {
super.onCancelled(s);
if( s!=null){
File file = new File(s);
if(file.exists()) file.delete();
dialog.dismiss();
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
dialog.dismiss();
if(result == null){
dialog.dismiss();
}
else{
if(new File(result).exists()){
try{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(result)), "video/mp4");
startActivity(intent);
}catch (ActivityNotFoundException exception){
Toast.makeText(ParentPageActivity.this, "Unable to Open File.", Toast.LENGTH_SHORT).show();
}
return;
}
}
Toast.makeText(ParentPageActivity.this, "Unable to Download Video File.", Toast.LENGTH_SHORT).show();
}
}