0

I need to check is apk installed or not by controlling packageName.(like powerclean app ->app manager ->apkFiles)

For this, i need to get packageName from apk file.(not label)

I already tried this

public void getApkPackage(String pathToApk) {

    Process mProcess = null;
    try {
        mProcess = Runtime.getRuntime().exec("aapt dump badging "+pathToApk);

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

But it returns

ava.io.IOException: Error running exec(). Command: [aapt, dump, badging, /storage/emulated/0/asd.apk] Working Directory: null Environment: null
at java.lang.ProcessManager.exec(ProcessManager.java)
......
Caused by: java.io.IOException: Permission denied
at java.lang.ProcessManager.exec(Native Method)

I already added

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

these permissions.

Note: I dont want to get installed or not installed apk names, i already get them with this. I want to get apk packageName..

//get app name from apk
public static String getAppLabel(PackageManager pm, String pathToApk ,Context context) {
    PackageInfo packageInfo = pm.getPackageArchiveInfo(pathToApk, 0);

    if (Build.VERSION.SDK_INT >= 8) {
        // those two lines do the magic:
        packageInfo.applicationInfo.sourceDir = pathToApk;
        packageInfo.applicationInfo.publicSourceDir = pathToApk;
    }

    CharSequence label = pm.getApplicationLabel(packageInfo.applicationInfo);
    return label != null ? label.toString() : null;
}

More info part:

Example

I want to do exactly the same thing.

1-Get all apk path(except system folder) in phone (already did)

2-Get all installed packages on phone (already did)

3-Get PackageName from founded apks path (problem starts here)

4-Check every founded apks package name inside installed packages(easy part)

5-Add them to 2 arraylist (installed apks - not installed apks)

O. Kumru
  • 85
  • 7

3 Answers3

1

Try this:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Add respective layout
        setContentView(R.layout.main_activity);

        // Use package name which we want to check
        boolean isAppInstalled = appInstalledOrNot("com.check.application");  

        if(isAppInstalled) {
            //This intent will help you to launch if the package is already installed
            Intent LaunchIntent = getPackageManager()
                .getLaunchIntentForPackage("com.check.application");
            startActivity(LaunchIntent);

            Log.i("Application is already installed.");       
        } else {
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("Application is not currently installed.");
        }
    }

    private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }

}
  • I dont want to install apk silently. Just want to check is installed or not so user can decide to remove or keep apk files. – O. Kumru Nov 03 '17 at 09:47
1
public static void getApkPackage(PackageManager pm, String pathToApk) {
    String fullPath = pathToApk;
    PackageInfo info = pm.getPackageArchiveInfo(fullPath, 0);
    Log.i("Package", "PackageName: " + info.packageName + ", VersionName : " + info.versionName );

}

Result :

PackageName: me.pou.app, VersionName : 1.4.73
PackageName: com.elevenbitstudios.twommobile, VersionName : 1.4.3

Ok guys i found the answer. We dont need to run exec to get details of 'not installed' apk. Just use PackageManager.getPackageArchiveInfo with path so we will get apk details.

O. Kumru
  • 85
  • 7
0

You cant find the package name of uninstalled apk in phone like this, however you can find the package name of uninstalled apk manually.

Ajeet Yadav
  • 693
  • 1
  • 11
  • 31