2016-10-12 46 views
0

我正在尝试使用DownloadManager下载pdf。pdf使用下载管理器不会在预棒棒糖设备中下载

我传递参数的链接和从服务器生成的pdf文件并下载到设备中。所以我的下载链接会是一些什么样的这个

http://example.com/gen.php?data={......}

我的代码:

final Request request = new Request(Uri.parse(fromUrl)); 
request.setMimeType("application/pdf"); 
request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
request.setDestinationInExternalPublicDir(path, "ELALA_MANIFEST_" + System.currentTimeMillis() + ".pdf"); 

final DownloadManager dm = (DownloadManager) context 
     .getSystemService(Context.DOWNLOAD_SERVICE); 
try { 
    try { 
     dm.enqueue(request); 
    } catch (SecurityException e) { 
     request.setNotificationVisibility(Request.VISIBILITY_VISIBLE); 
     Log.e("Error", e.toString()); 
     dm.enqueue(request); 
    } 

} 
// if the download manager app has been disabled on the device 
catch (IllegalArgumentException e) { 
    openAppSettings(context, 
      AdvancedWebView.PACKAGE_NAME_DOWNLOAD_MANAGER); 
} 

工作正常设备与API级别21(棒棒糖)及以上。但在较低版本的PDF没有得到下载。和通知弹出类似,

<untitled> download unsuccessful 

我知道这东西有setMimeType的事,但不知道是什么。

任何帮助将不胜感激。

+0

其他文件类型在你的预棒棒糖正常工作? –

+0

@KamranAhmed是... –

+0

你能获取下载管理器数据库使用'adb root && adb pull /data/data/com.android.providers.downloads/databases/downloads.db .'? –

回答

1

当您得到<untitled> download unsuccessful时,通常意味着您的网址不正确或为空或为空。所以首先请确定url是可以的。

看看我的一个小例子,它运行在4.4(pre-lolipop)下的DownloadManager中。

import android.app.DownloadManager; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.text.TextUtils; 
import android.util.Log; 
import android.view.View; 

import java.io.File; 

public class MainActivity extends AppCompatActivity { 

    private DownloadManager dm; 
    private String url; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 
     url = "https://collegereadiness.collegeboard.org/pdf/psat-nmsqt-practice-test-1.pdf"; 

     findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (TextUtils.isEmpty(url)) { 
        throw new IllegalArgumentException("url cannot be empty or null"); 
       } 

       DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
       request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 

       if (isExternalStorageWritable()) { 
        String uriString = v.getContext().getExternalFilesDir(null) + ""; 
        File file = new File(uriString, Uri.parse(url).getLastPathSegment()); 
        Uri destinationUri = Uri.fromFile(file); 
        request.setDestinationUri(destinationUri); 
        dm.enqueue(request); 
       } 
      } 
     }); 

     registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 
    } 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
       Log.d(TAG, "onReceive() returned: " + action); 
       // TODO: 2016-10-12 
      } else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) { 
       Log.d(TAG, "onReceive() returned: " + action); 
       // TODO: 2016-10-12 
      } 
     } 
    }; 

    private static final String TAG = "MainActivity"; 

    //... 

    public boolean isExternalStorageWritable() { 
     String state = Environment.getExternalStorageState(); 
     return Environment.MEDIA_MOUNTED.equals(state); 
    } 

    public boolean isExternalStorageReadable() { 
     String state = Environment.getExternalStorageState(); 
     return Environment.MEDIA_MOUNTED.equals(state) || 
       Environment.MEDIA_MOUNTED_READ_ONLY.equals(state); 
    } 
} 

它使用权限:

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

它来处理所有的条件是很重要的。另外尝试使用应用程序目录,而不是在你的SD卡上搞乱。本示例将下载的文件保存在 /sdcard/Android/data/{your app package name}/files/中。以前我检查我是否已经安装了SD卡,以及我是否可以在目录上写入。

样品:

enter image description here


好吧,这是我与解析的文件名,如果标题有“内容Disposition`场你说是你的服务器上,这样您就可以样品。做到这一点:)

import android.app.DownloadManager; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.text.TextUtils; 
import android.util.Log; 
import android.view.View; 

import java.io.File; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class MainActivity extends AppCompatActivity { 

    private DownloadManager dm; 
    private String url; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 
     url = "http://dl1.shatelland.com/files/07610a8d-a73f-45bb-8868-6fd33299bda7/6e33639f-0ce0-43ef-86e4-43492db1be86"; 

     findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(final View v) { 

       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         downloadFileInTask(v.getContext(), url); 
        } 
       }).start(); 
      } 
     }); 

     registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 
    } 

    private void downloadFileInTask(Context v, String url) { 
     if (TextUtils.isEmpty(this.url)) { 
      throw new IllegalArgumentException("url cannot be empty or null"); 
     } 

     /*when redirecting from hashed url and found headerField "Content-Disposition"*/ 
     String resolvedFile = resolveFile(url, "unknown_file"); 

     DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
     request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 

     if (isExternalStorageWritable()) { 
      File file = new File(v.getExternalFilesDir(null), resolvedFile); 
      Uri destinationUri = Uri.fromFile(file); 
      request.setDestinationUri(destinationUri); 
      dm.enqueue(request); 
     } 
    } 

    private String resolveFile(String url, String defaultFileName) { 
     String filename = defaultFileName; 

     HttpURLConnection con = null; 
     try { 
      con = (HttpURLConnection) new URL(url).openConnection(); 
      con.setInstanceFollowRedirects(true); 
      con.connect(); 

      String contentDisposition = con.getHeaderField("Content-Disposition"); 
      if (!TextUtils.isEmpty(contentDisposition)) { 
       String[] splittedCD = contentDisposition.split(";"); 
       for (int i = 0; i < splittedCD.length; i++) { 
        if (splittedCD[i].trim().startsWith("filename=")) { 
         filename = splittedCD[i].replaceFirst("filename=", "").trim(); 
         break; 
        } 
       } 
      } 

      con.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return filename; 
    } 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
       Log.d(TAG, "onReceive() returned: " + action); 
       // TODO: 2016-10-12 
      } else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) { 
       Log.d(TAG, "onReceive() returned: " + action); 
       // TODO: 2016-10-12 
      } 
     } 
    }; 

    private static final String TAG = "MainActivity"; 

    //... 

    public boolean isExternalStorageWritable() { 
     String state = Environment.getExternalStorageState(); 
     return Environment.MEDIA_MOUNTED.equals(state); 
    } 

    public boolean isExternalStorageReadable() { 
     String state = Environment.getExternalStorageState(); 
     return Environment.MEDIA_MOUNTED.equals(state) || 
       Environment.MEDIA_MOUNTED_READ_ONLY.equals(state); 
    } 
} 
+0

感谢您的回复。但我是我的情况pdf不保存在服务器上的某个地方。它是从我通过的参数中生成的。所以我的下载链接会是这样的'http://example.com/gen.php?data= {......}' –

+0

好吧,谢谢你,我会尝试编辑我的答案。创建问题时请更具体。 :) – deadfish

+0

好的..谢谢..为你关心。 –

相关问题