如何启用Android下载pipe理器

我正在使用Android Download Manager下载文件列表。 最近我遇到了一个崩溃报告

Unknown java.lang.IllegalArgumentException: Unknown URL content://downloads/my_downloads

后来,我发现原因是因为用户禁用了Android Download Manager。 我用下面的代码检查下载pipe理器的包名是否被禁用。

 int state = this.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads"); 

现在,我需要find一种方法来启用下载pipe理器,如果它被禁用。 我试图设置它的启用状态与清单的权限,但我不断收到安全例外。

 this.getPackageManager().setApplicationEnabledSetting("com.android.providers.downloads", PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> 

所以我认为它可能无法访问,因为它是一个系统应用程序。 (谷歌Play应用程序)。

有没有办法将用户redirect到“下载pipe理器应用程序信息”视图? 让用户启用它? 如果没有办法以编程方式在运行时启用它。

Solutions Collecting From Web of "如何启用Android下载pipe理器"

如果无效,请编辑我的答案

检查下载pipe理器是否可用:

  int state = this.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads"); if(state==PackageManager.COMPONENT_ENABLED_STATE_DISABLED|| state==PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER ||state==PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED){ // Cannot download using download manager } else { request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); request.setDescription(fileName); manager.enqueue(request); } 

而试图启用下载pipe理器的解决scheme是:

 packageName = "com.android.providers.downloads" try { //Open the specific App Info page: Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + packageName)); startActivity(intent); } catch ( ActivityNotFoundException e ) { //e.printStackTrace(); //Open the generic Apps page: Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); startActivity(intent); } 

有些人正在寻找这个问题的答案,我只是意识到,对这个问题的答案是以某种方式删除。 所以我想回答我自己的问题。

无法直接激活/停用Download Manager,因为它是系统应用程序,我们无法访问它。

只有替代方法是将用户redirect到下载pipe理器应用程序的信息页面。

 try { //Open the specific App Info page: Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + "com.android.providers.downloads")); startActivity(intent); } catch ( ActivityNotFoundException e ) { e.printStackTrace(); //Open the generic Apps page: Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); startActivity(intent); } 

Google Gmail收件箱检查DownloadManager是否被禁用,如果是true,则显示一个AlertDialog告诉用户在设置中启用DownloadManager。截图如下所示:

在这里输入图像说明

我写了一个名为DownloadManagerResolver的类来解决这个问题,希望这能帮助你。

 public final class DownloadManagerResolver { private static final String DOWNLOAD_MANAGER_PACKAGE_NAME = "com.android.providers.downloads"; /** * Resolve whether the DownloadManager is enable in current devices. * * @return true if DownloadManager is enable,false otherwise. */ public static boolean resolve(Context context) { boolean enable = resolveEnable(context); if (!enable) { AlertDialog alertDialog = createDialog(context); alertDialog.show(); } return enable; } /** * Resolve whether the DownloadManager is enable in current devices. * * @param context * @return true if DownloadManager is enable,false otherwise. */ private static boolean resolveEnable(Context context) { int state = context.getPackageManager() .getApplicationEnabledSetting(DOWNLOAD_MANAGER_PACKAGE_NAME); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { return !(state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED); } else { return !(state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); } } private static AlertDialog createDialog(final Context context) { AppCompatTextView messageTextView = new AppCompatTextView(context); messageTextView.setTextSize(16f); messageTextView.setText("DownloadManager is disabled. Please enable it."); return new AlertDialog.Builder(context) .setView(messageTextView, 50, 30, 50, 30) .setPositiveButton("ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { enableDownloadManager(context); } }) .setCancelable(false) .create(); } /** * Start activity to Settings to enable DownloadManager. */ private static void enableDownloadManager(Context context) { try { //Open the specific App Info page: Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:" + DOWNLOAD_MANAGER_PACKAGE_NAME)); context.startActivity(intent); } catch (ActivityNotFoundException e) { e.printStackTrace(); //Open the generic Apps page: Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); context.startActivity(intent); } } } 

可能是对你有帮助。

 downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE); DownloadManager.Request request = new DownloadManager.Request(Download_Uri); //Restrict the types of networks over which this download may proceed. request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE); //Set whether this download may proceed over a roaming connection. request.setAllowedOverRoaming(false); //Set the title of this download, to be displayed in notifications (if enabled). request.setTitle("My Data Download"); //Set a description of this download, to be displayed in notifications (if enabled) request.setDescription("Android Data download using DownloadManager."); //Set the local destination for the downloaded file to a path within the application's external files directory request.setDestinationInExternalFilesDir(this,Environment.DIRECTORY_DOWNLOADS,"CountryList.json"); //Enqueue a new download and same the referenceId downloadReference = downloadManager.enqueue(request); 

http://www.mysamplecode.com/2012/09/android-downloadmanager-example.html