如何启用Android下载管理器

38

我正在使用Android下载管理器下载文件列表。最近,我遇到了一个崩溃报告,其中提示:

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

后来,我发现原因是用户已禁用了Android下载管理器。我通过以下代码检查下载管理器是否被禁用,以解决此问题。

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

现在,我需要找到一种方法来启用下载管理器,如果它被禁用的话。我尝试使用清单中的权限设置其启用状态,但我一直收到安全异常。

this.getPackageManager().setApplicationEnabledSetting("com.android.providers.downloads", PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0);

<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>

所以我认为由于它是一个系统应用程序,可能无法到达。(谷歌应用商店可以做到)。

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


你有答案了吗? - Sunny
很抱歉,@johnsmith。我认为您开发的应用程序需要成为系统应用程序才能直接访问下载管理器设置。 - osayilgan
你想要的是这个吗?显示应用程序信息 - ray.kc.liu
我可能已经尝试过这个了,但我会再试一次并让你知道它是否可以成为一个解决方案。谢谢。 - osayilgan
你如何检查下载管理器是否启用?请给我一个例子。 - Device
显示剩余2条评论
4个回答

22

如果不正确,请编辑我的答案。

检查是否有可用的下载管理器:

   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); 
            }

尝试启用下载管理器的解决方案是:

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);

}

1
谢谢回答,但是@ray_pixar已经给出了相同的答案。 - osayilgan
我认识我的朋友,但我认为每个人都应该使用代码来看到解决方案。 - Device
与下载管理器本身无关,正如您所指出的“请求”和“管理器”对象。 - osayilgan

10

有些人在寻找这个问题的答案,但我发现之前回答这个问题的答案已经被删除了。所以我想自己来回答这个问题。

没有直接激活/停用下载管理器的方法,因为它是系统应用程序,我们无法访问它。

唯一的选择是将用户重定向到下载管理器应用程序的信息页面。

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);
}

8

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

enter image description here

我写了一个叫做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);
    }
}
}

谢谢你的回答。但请先阅读已接受的答案,告诉我你的回答是否有任何不同之处。这个答案完全相同,只是用对话框窗口包装了一下。 - osayilgan

0

也许对你有帮助。

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


1
这个回答与问题无关。这段代码只是将请求排队给下载管理器。我需要做的是启用下载管理器,通常用户可以在设置->应用程序->下载管理器->启用中启用它。 - osayilgan
1
只有通过系统设置才能实现。否则会显示安全异常。我已经尝试过如下方式。<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> int state = this.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");this.getPackageManager().setApplicationEnabledSetting("com.android.providers.downloads", PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); - Karthikeyan
所以你需要成为系统应用程序才能启用它。但事实并非如此,我猜只凭一般权限无法做到这点。感谢您的贡献。 - osayilgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接