Responsible for wrapping calls to PackageManager to ensure that they always complete without throwing RuntimeExceptions. : PackageInfo « Core Class « Android






Responsible for wrapping calls to PackageManager to ensure that they always complete without throwing RuntimeExceptions.

    
//package org.acra.util;

//import static org.acra.ACRA.LOG_TAG;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.util.Log;

/**
 * Responsible for wrapping calls to PackageManager to ensure that they always complete without throwing RuntimeExceptions.
 * <p>
 *     Depending upon the state of the application it is possible that
 *     <ul>
 *         <li>Context has no PackageManager.</li>
 *         <li>PackageManager returned by Context throws RuntimeException("Package manager has died")
 *              because it cannot contact the remote PackageManager service.
 *         </li>
 *     </ul>
 *     I suspect that PackageManager death is caused during app installation.
 *     But we need to make ACRA bullet proof, so it's better to handle the condition safely so that the error report itself doesn't fail.
 * </p>
 * @author William Ferguson
 * @since 4.3.0
 */
public final class PackageManagerWrapper {

    private final Context context;

    public PackageManagerWrapper(Context context) {
        this.context = context;
    }

    /**
     * @param permission    Manifest.permission to check whether it has been granted.
     * @return true if the permission has been granted to the app, false if it hasn't been granted or the PackageManager could not be contacted.
     */
    public boolean hasPermission(String permission) {
        final PackageManager pm = context.getPackageManager();
        if (pm == null) {
            return false;
        }

        try {
            return pm.checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED;
        } catch (RuntimeException e) {
            // To catch RuntimeException("Package manager has died") that can occur on some version of Android,
            // when the remote PackageManager is unavailable. I suspect this sometimes occurs when the App is being reinstalled.
            return false;
        }
    }

    /**
     * @return PackageInfo for the current application or null if the PackageManager could not be contacted.
     */
    public PackageInfo getPackageInfo() {
        final PackageManager pm = context.getPackageManager();
        if (pm == null) {
            return null;
        }

        try {
            return pm.getPackageInfo(context.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
          //  Log.v(LOG_TAG, "Failed to find PackageInfo for current App : " + context.getPackageName());
            return null;
        } catch (RuntimeException e) {
            // To catch RuntimeException("Package manager has died") that can occur on some version of Android,
            // when the remote PackageManager is unavailable. I suspect this sometimes occurs when the App is being reinstalled.
            return null;
        }
    }
}

   
    
    
    
  








Related examples in the same category

1.Is package installed
2.Check System Feature
3.show Installed App Details
4.get Permissions For Package