Android Oreo(8.0)에서 추가된 새로운 내용 중에 App category에 대해서 알아보려고 합니다. App category는 Data Usage, Storage Usage 등의 앱에서 자신의 앱이 어떻게 분류되었으면 좋을지 선택하는 것입니다.
만약 PlayStore에서 App category를 이용하여 Game app을 분류할 때, 자신의 앱의 App cateogry를 Game으로 설정하면 그 그룹에 속할 수 있습니다.
실제로 PlayStore가 이 방법을 사용하는지는 모르겠지만, 다양한 앱에서 App category를 이용하여 category를 분류하는데 사용할 가능성이 있습니다.
App category 설정
App category를 설정하는 방법은 AndroidManifest.xml
의 application TAG아래에 android:appCategory
property를 등록하면 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.codechacha.appcategory">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:appCategory="game">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
category의 종류는 8가지가 있습니다. 아래 그림처럼 AndroidStudio에서 Ctrl + Space
를 누르면 선택할 수 있는 옵션이 나옵니다.
설치된 App의 Category 확인
App들을 Category별로 분류를 하려면 설치된 앱들의 category를 확인해야 하는데요. PackageManager를 통해서 ActivityInfo를 얻을 수 있고, 이로 category를 확인할 수 있습니다.
아래 코드처럼 입력하시면 설치된 App들의 ActivityInfo를 얻을 수 있습니다. category는 int로 저장되고, 이를 String으로 변환하고 싶으면 ApplicationInfo.getCategoryTitle()를 사용하면 됩니다.
package com.codechacha.appcategory;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<PackageInfo> result = getPackageManager().getInstalledPackages(0);
if (result != null) {
for (PackageInfo info : result) {
String packageName = info.packageName;
int categoryNumber = info.applicationInfo.category;
CharSequence categoryString =
ApplicationInfo.getCategoryTitle(this, categoryNumber);
Log.d(TAG, "App name: " + packageName +", category: " + categoryString);
}
}
}
}
Framework 코드인 ApplicationInfo.java를 보시면 Category를 int형식으로 처리하고, String으로 변환할 수 있는 getCategoryTitle()를 제공하고 있습니다.
// ..frameworks/base/core/java/android/content/pm/ApplicationInfo.java
public static final int CATEGORY_GAME = 0;
public static final int CATEGORY_AUDIO = 1;
public static final int CATEGORY_VIDEO = 2;
public static final int CATEGORY_IMAGE = 3;
public static final int CATEGORY_SOCIAL = 4;
public static final int CATEGORY_NEWS = 5;
public static final int CATEGORY_MAPS = 6;
public static final int CATEGORY_PRODUCTIVITY = 7;
public static CharSequence getCategoryTitle(Context context, @Category int category) {
switch (category) {
case ApplicationInfo.CATEGORY_GAME:
return context.getText(com.android.internal.R.string.app_category_game);
case ApplicationInfo.CATEGORY_AUDIO:
return context.getText(com.android.internal.R.string.app_category_audio);
case ApplicationInfo.CATEGORY_VIDEO:
return context.getText(com.android.internal.R.string.app_category_video);
case ApplicationInfo.CATEGORY_IMAGE:
return context.getText(com.android.internal.R.string.app_category_image);
case ApplicationInfo.CATEGORY_SOCIAL:
return context.getText(com.android.internal.R.string.app_category_social);
case ApplicationInfo.CATEGORY_NEWS:
return context.getText(com.android.internal.R.string.app_category_news);
case ApplicationInfo.CATEGORY_MAPS:
return context.getText(com.android.internal.R.string.app_category_maps);
case ApplicationInfo.CATEGORY_PRODUCTIVITY:
return context.getText(com.android.internal.R.string.app_category_productivity);
default:
return null;
}
}
앱을 실행해서 Log를 확인하면, Category를 확인해볼 수 있습니다. 이를 통해서 앱들을 분류하면 되겠죠?
null로 나오는 것은 category를 설정하지 않은 앱들입니다.
01-09 21:55:30.075 3014 3014 D MainActivity: App name: com.google.android.youtube, category: Movies & Video
01-09 21:55:30.076 3014 3014 D MainActivity: App name: com.google.android.apps.messaging, category: Social & Communication
01-09 21:55:30.076 3014 3014 D MainActivity: App name: com.google.android.apps.inputmethod.hindi, category: null
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.apps.tachyon, category: Social & Communication
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.music, category: Music & Audio
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.apps.docs, category: Productivity
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.apps.maps, category: Maps & Navigation
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.feedback, category: null
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.printservice.recommendation, category: Productivity
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.apps.photos, category: Photos & Images
01-09 21:55:30.077 3014 3014 D MainActivity: App name: com.google.android.calendar, category: Productivity
01-09 21:55:30.078 3014 3014 D MainActivity: App name: com.android.managedprovisioning, category: null
01-09 21:55:30.078 3014 3014 D MainActivity: App name: com.android.providers.contacts, category: null
01-09 21:55:30.078 3014 3014 D MainActivity: App name: com.codechacha.appcategory, category: Games
......
참고
- 예제로 사용한 코드는 GitHub: App categories에서 확인하실 수 있습니다.
- Android 8.0 Features and APIs
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력