5

I have upgraded targetSdkVersion and compileSdkVersion to 33.

Now getting warning getApplicationInfo(String,int) is deprecated.

It is suggested to use use getApplicationInfo(java.lang.String, android.content.pm.PackageManager.ApplicationInfoFlags) instead. Anyone can help me to use the updated method.

Example:

@SuppressLint("HardwareIds")
    public void initDbx(){
        try {
            ApplicationInfo app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);
            dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));
            dbx.game_name    = activity.getResources().getString(R.string.app_name);
            dbx.package_name = activity.getApplication().getPackageName();
            dbx.user_id      = Settings.Secure.getString(activity.getContentResolver(), Settings.Secure.ANDROID_ID);
            dbx.check_net    = isConnectionAvailable();
            //dbx.getUserInfos(activity);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}

So, I did this:

    @SuppressLint("HardwareIds")
    public void initDbx(){
        try {
//            ApplicationInfo app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
                ApplicationInfo app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.ApplicationInfoFlags.of(0));
            }else{
                ApplicationInfo app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);
            }
            
            dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));
            dbx.game_name    = activity.getResources().getString(R.string.app_name);
            dbx.package_name = activity.getApplication().getPackageName();
            dbx.user_id      = Settings.Secure.getString(activity.getContentResolver(), Settings.Secure.ANDROID_ID);
            dbx.check_net    = isConnectionAvailable();
            //dbx.getUserInfos(activity);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Get the error (Cannot resolve symbol 'app')

            dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));

I created local variable 'app':

            PackageItemInfo app;
            dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));

Get the error (Variable 'app' might not have been initialized)

I initialize the variable; I tried both:

            PackageItemInfo app = null;
            dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));

and:

            PackageItemInfo app = new PackageItemInfo();
            dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));

But I kept getting the same warning, and I couldn't even run the app in the emulator this time.

Upside-Down
  • 51
  • 1
  • 4

1 Answers1

6

getApplicationInfo(String packageName,int flags) have been deprecated in Android Api 33.
We need to use getApplicationInfo(java.lang.String,android.content.pm.PackageManager.ApplicationInfoFlags)

  if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
      ApplicationInfo app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.ApplicationInfoFlags.of(0));
  }else{
      ApplicationInfo app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);
  }

You can pass either zero or combinations of other component info flags in ApplicationInfoFlags. More details in ApplicationInfoFlags

Edited: Completed initDbx() method

 public void initDbx(){
        try {
            ApplicationInfo app;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
                app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.ApplicationInfoFlags.of(0));
            }else{
                 app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);
            }

            dbx.game_id      = String.valueOf(app.metaData.getInt("main_id"));
            dbx.game_name    = activity.getResources().getString(R.string.app_name);
            dbx.package_name = activity.getApplication().getPackageName();
            dbx.user_id      = Settings.Secure.getString(activity.getContentResolver(), Settings.Secure.ANDROID_ID);
            dbx.check_net    = isConnectionAvailable();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
Nitish
  • 3,075
  • 3
  • 13
  • 28
  • Thanks for the answer @Nitish, I've edited my question, can you check it out? – Upside-Down Feb 28 '23 at 23:23
  • @Upside-Down , make `ApplicationInfo app` a global variable , current it's local inside `if-else` – Nitish Mar 01 '23 at 04:48
  • How do I do that Did you mean to create field 'app' in UtilsManager Like this: private PackageItemInfo app; Because this prevented the app from launching in the emulator – Upside-Down Mar 01 '23 at 21:31
  • Why would that prevent app from launching? . Anyways you can just make it outside the `if else` statement so that is accessible out of the conditions. Have edited my answer – Nitish Mar 02 '23 at 05:08
  • I was making it after the `if-else ` its launching now but I'm still getting the deprecation warning. – Upside-Down Mar 02 '23 at 22:03
  • It doesn't show at my system, can you please share more details on this, – Nitish Mar 03 '23 at 05:09
  • like what? ask me. This java file is about 200 lines long, all I know is that I keep getting this warning as long as I don't completely get rid of this one; `app = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA);` – Upside-Down Mar 03 '23 at 07:00
  • [handle-is-deprecated-deprecated-in-java](https://stackoverflow.com/questions/74506278/how-to-handle-is-deprecated-deprecated-in-java) this could be most probable reason why warning is still showing – Nitish Mar 03 '23 at 07:14