Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
563 views
in Technique[技术] by (71.8m points)

android - How to check telephony and camera availability for SDK version < 5

Standard way of checking camera and telephony hardware availability works only since SDK >= 5:

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

My problem that I need to runtime define availability of telephony and camera in SDK 3 (Android 1.5)

Any ideas?

P.S. I understand that Android 1.5 is very outdated, but still I do have bunch of customers running these devices, so I have to keep compatibility with them.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Well, I have found solution - very odd but it's working.

Basically method tries to get telephony service if it's null - it returns false, if it's not null (e.g. for HTC Flyer TelephonyManager is not null) method tries to run PackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY) using reflection, since this method is not available for old versions of SDK.

Here is a code:

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;
}

More or less the same approach is workable for checking of camera availability


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...