Как проверить телефонию и доступность камеры для версии SDK <5 - PullRequest
4 голосов
/ 24 июня 2011

Стандартный способ проверки доступности оборудования камеры и телефонии работает только с SDK> = 5:

PackageManager pm = this.getPackageManager();
boolean hasTelephony=pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
boolean hasCamera=pm.hasSystemFeature(PackageManager.FEATURE_CAMERA);

Моя проблема в том, что мне нужно во время выполнения определить доступность телефонии и камеры в SDK 3 (Android 1.5)

Есть идеи?

PS Я понимаю, что Android 1.5 очень устарел, но у меня все еще есть клиенты, использующие эти устройства, поэтому я должен поддерживать совместимость с ними.

1 Ответ

3 голосов
/ 04 июля 2011

Ну, я нашел решение - очень странное, но оно работает.

В основном метод пытается получить услугу телефонии, если он нулевой - он возвращает false, если он не нулевой (например, для HTC Flyer TelephonyManager не равен нулю), метод пытается запустить PackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY) с использованием отражения, поскольку этот методнедоступно для старых версий SDK.

Вот код:

private Boolean hasTelephony;

public boolean hasTelephony()
{
    if(hasTelephony==null)
    {
        TelephonyManager tm=(TelephonyManager )this.getSystemService(Context.TELEPHONY_SERVICE);
        if(tm==null)
        {
            hasTelephony=new Boolean(false);
            return hasTelephony.booleanValue();
        }
        if(this.getSDKVersion() < 5)
        {
            hasTelephony=new Boolean(true);
            return hasTelephony;
        }
        PackageManager pm = this.getPackageManager();
        Method method=null;
        if(pm==null)
            return hasCamera=new Boolean(false);
        else
        {
            try
            {
                Class[] parameters=new Class[1];
                parameters[0]=String.class;
                method=pm.getClass().getMethod("hasSystemFeature", parameters);
                Object[] parm=new Object[1];
                parm[0]=new String(PackageManager.FEATURE_TELEPHONY);
                Object retValue=method.invoke(pm, parm);
                if(retValue instanceof Boolean)
                    hasTelephony=new Boolean(((Boolean )retValue).booleanValue());
                else
                    hasTelephony=new Boolean(false);
            }
            catch(Exception e)
            {
                hasTelephony=new Boolean(false);
            }
        }
    }
    return hasTelephony;
}

Более или менее тот же подход применим для проверки доступности камеры

...