web-dev-qa-db-ja.com

有効にする方法Android Download Manager

Android Download Managerを使用してファイルのリストをダウンロードしています。最近、次のようなクラッシュレポートに遭遇しました

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

その後、ユーザーがAndroid Download Managerを無効にしているためです。ダウンロードマネージャーが無効になっているかどうかを確認するには、次のコードでパッケージ名を確認します。

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"/>

だから私はそれがシステムアプリであるために到達できないかもしれないと思った。 (Google Playアプリがそれを行います)。

ユーザーをDownload Manager Application Infoビューにリダイレクトする方法はありますか?ユーザーがそれを有効にするには?実行時にプログラムで有効にする方法がない場合。

38
osayilgan

一部の人々はこの質問への回答を探していましたが、この質問に対する回答が何らかの形で削除されていることに気付きました。だから私は自分の質問に答えたいです。

Download Managerはシステムアプリケーションであり、アクセスできないため、Download Managerを直接アクティブ化/非アクティブ化する方法はありません。

唯一の代替手段は、ユーザーをダウンロードマネージャーアプリケーションの情報ページにリダイレクトすることです。

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

有効でない場合は回答を編集してください

ダウンロードマネージャーが利用可能かどうかを確認します。

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

}
22
Device

Google Gmail Inboxは、DownloadManagerが無効になっているかどうかを確認し、trueの場合、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);
    }
}
}
7
Folyd

助けになるかもしれません。

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

0
Karthikeyan