HOME > android > feature

안드로이드 O - 앱 카테고리(App categories) 살펴보기

JSFollow10 Jan 2018

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를 누르면 선택할 수 있는 옵션이 나옵니다.

Downloadable Font

설치된 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
......

참고