Android 在呼出呼叫前检测Sim卡提供商的基站强度

Android 在呼出呼叫前检测Sim卡提供商的基站强度,android,telephonymanager,Android,Telephonymanager,如何在呼出呼叫前获得信号塔强度,如果没有信号或强度不足,则应以文本no signal提示用户。参见此。这应该可以解决问题。您好,请使用以下代码,希望它能解决您的问题 HomeActivity .java // Android Packages import android.app.Activity; import android.os.Bundle; import android.os.Build; import android.os.AsyncTask; import android.vie

如何在呼出呼叫前获得信号塔强度,如果没有信号或强度不足,则应以文本no signal提示用户。

参见此。这应该可以解决问题。

您好,请使用以下代码,希望它能解决您的问题

HomeActivity .java

// Android Packages
import android.app.Activity;
import android.os.Bundle;
import android.os.Build;
import android.os.AsyncTask;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.content.Intent;
import android.widget.TextView;
import android.widget.Button;
import android.telephony.SignalStrength;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.telephony.CellLocation;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.widget.Toast;
import android.util.Log;

public final class HomeActivity extends Activity
{
        public static final String TAG = HomeActivity.class.getSimpleName();

        public static final String EMAIL = "tbarrasso@sevenplusandroid.org";

        private CellLocation mCellLocation;
        private SignalStrength mSignalStrength;
        private boolean mDone = false;
        private TextView mText = null;
        private String mTextStr;
        private Button mSubmit, mCancel;
        private TelephonyManager mManager;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
            mText = (TextView) findViewById(R.id.text);
            mSubmit = (Button) findViewById(R.id.submit);
            mCancel = (Button) findViewById(R.id.cancel);

            // Prevent button press.
            mSubmit.setEnabled(false);

            // Handle click events.
            mSubmit.setOnClickListener(new OnClickListener()
            {
                    @Override
                    public void onClick(View mView)
                    {
                            sendResults();
                            finish();
                    }
            });
            mCancel.setOnClickListener(new OnClickListener()
            {
                    @Override
                    public void onClick(View mView)
                    {
                            finish();
                    }
            });

            // Register the listener with the telephony manager
            mManager.listen(mListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS |
                    PhoneStateListener.LISTEN_CELL_LOCATION);
    }

    // Listener for signal strength.
    final PhoneStateListener mListener = new PhoneStateListener()
    {
            @Override
            public void onCellLocationChanged(CellLocation mLocation)
            {
                    if (mDone) return;

                    Log.d(TAG, "Cell location obtained.");

                    mCellLocation = mLocation;

                    update();
            }

            @Override
            public void onSignalStrengthsChanged(SignalStrength sStrength)
            {
                    if (mDone) return;

                    Log.d(TAG, "Signal strength obtained.");

                    mSignalStrength = sStrength;

                    update();
            }
    };

    // AsyncTask to avoid an ANR.
    private class ReflectionTask extends AsyncTask<Void, Void, Void>
    {
                protected Void doInBackground(Void... mVoid)
                {
                        mTextStr = 
                            ("DEVICE INFO\n\n" + "SDK: `" + Build.VERSION.SDK_INT + "`\nCODENAME: `" +
                            Build.VERSION.CODENAME + "`\nRELEASE: `" + Build.VERSION.RELEASE +
                            "`\nDevice: `" + Build.DEVICE + "`\nHARDWARE: `" + Build.HARDWARE +
                            "`\nMANUFACTURER: `" + Build.MANUFACTURER + "`\nMODEL: `" + Build.MODEL +
                            "`\nPRODUCT: `" + Build.PRODUCT + ((getRadio() == null) ? "" : ("`\nRADIO: `" + getRadio())) +
                            "`\nBRAND: `" + Build.BRAND + ((Build.VERSION.SDK_INT >= 8) ? ("`\nBOOTLOADER: `" + Build.BOOTLOADER) : "") +
                            "`\nBOARD: `" + Build.BOARD + "`\nID: `"+ Build.ID + "`\n\n" +
                            ReflectionUtils.dumpClass(SignalStrength.class, mSignalStrength) + "\n" +
                            ReflectionUtils.dumpClass(mCellLocation.getClass(), mCellLocation) + "\n" + getWimaxDump() +
                            ReflectionUtils.dumpClass(TelephonyManager.class, mManager) +
                            ReflectionUtils.dumpStaticFields(Context.class, getApplicationContext()));

                    return null;
                }

                protected void onProgressUpdate(Void... progress)
                {
                        // Do nothing...
                }

                protected void onPostExecute(Void result)
                {
                        complete();
                }
        }

    private final void complete()
    {
            mDone = true;

            try
            {
                    mText.setText(mTextStr);

                        // Stop listening.
                        mManager.listen(mListener, PhoneStateListener.LISTEN_NONE);
                        Toast.makeText(getApplicationContext(), R.string.done, Toast.LENGTH_SHORT).show();

                        mSubmit.setEnabled(true);
                }
                catch (Exception e)
                {
                        Log.e(TAG, "ERROR!!!", e);
                }
    }

    private final void update()
    {
            if (mSignalStrength == null || mCellLocation == null) return;

            final ReflectionTask mTask = new ReflectionTask();
            mTask.execute();
    }

    /**
     * @return The Radio of the {@link Build} if available.
     */
    public static final String getRadio()
    {
            if (Build.VERSION.SDK_INT >= 8 && Build.VERSION.SDK_INT < 14)
                    return Build.RADIO;
            else if (Build.VERSION.SDK_INT >= 14)
                    return Build.getRadioVersion();
            else
                    return null;
    }

    private static final String[] mServices =
        {
                "WiMax", "wimax", "wimax", "WIMAX", "WiMAX"
        };

    /**
     * @return A String containing a dump of any/ all WiMax
     * classes/ services loaded via {@link Context}.
     */
    public final String getWimaxDump()
    {
            String mStr = "";

            for (final String mService : mServices)
            {
                    final Object mServiceObj = getApplicationContext()
                            .getSystemService(mService);
                    if (mServiceObj != null)
                    {
                            mStr += "getSystemService(" + mService + ")\n\n";
                            mStr += ReflectionUtils.dumpClass(mServiceObj.getClass(), mServiceObj);
                        }
            }

            return mStr;
    }

    /**
     * Start an {@link Intent} chooser for the user to submit the results.
     */
    public final void sendResults()
    {
            final Intent mIntent = new Intent(Intent.ACTION_SEND);
                mIntent.setType("plain/text");
                mIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { EMAIL });
                mIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.results));
                mIntent.putExtra(Intent.EXTRA_TEXT, mTextStr);
                HomeActivity.this.startActivity(Intent.createChooser(mIntent, "Send results."));
    }
}
HomeActivity.java
//安卓软件包
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Build;
导入android.os.AsyncTask;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.content.Context;
导入android.content.Intent;
导入android.widget.TextView;
导入android.widget.Button;
导入android.telephony.SignalStrength;
导入android.telephony.PhoneStateListener;
导入android.telephony.TelephonyManager;
导入android.telephony.CellLocation;
导入android.telephony.cdma.cdmcelllocation;
导入android.telephony.gsm.GsmCellLocation;
导入android.widget.Toast;
导入android.util.Log;
公共期末班家庭活动扩展活动
{
公共静态最终字符串标记=HomeActivity.class.getSimpleName();
公共静态最终字符串电子邮件=”tbarrasso@sevenplusandroid.org";
专用小区定位mCellLocation;
私人信号强度;
私有布尔mDone=false;
私有文本视图mText=null;
私有字符串mTextStr;
专用按钮mSubmit,McCancel;
专用电话管理器mManager;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mManager=(TelephonyManager)getSystemService(Context.TELEPHONY_服务);
mText=(TextView)findViewById(R.id.text);
mSubmit=(按钮)findviewbyd(R.id.submit);
mCancel=(按钮)findViewById(R.id.cancel);
//防止按钮按下。
mSubmit.setEnabled(false);
//处理单击事件。
mSubmit.setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图mView)
{
sendResults();
完成();
}
});
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图mView)
{
完成();
}
});
//向电话管理器注册侦听器
mManager.listen(mListener、PhoneStateListener.listen\u信号\u)|
PhoneStateListener.LISTEN\u CELL\u LOCATION);
}
//监听信号强度。
final PhoneStateListener mListener=新PhoneStateListener()
{
@凌驾
CellLocation更改后的公共无效(CellLocation MLLocation)
{
if(mDone)返回;
Log.d(标签“获得细胞位置”);
mCellLocation=mLocation;
更新();
}
@凌驾
信号强度上的公共空隙已更改(信号强度)
{
if(mDone)返回;
Log.d(标签“获得信号强度”);
mSignalStrength=sStrength;
更新();
}
};
//异步任务以避免ANR。
私有类ReflectionTask扩展异步任务
{
受保护的Void doInBackground(Void…mVoid)
{
mTextStr=
(“设备信息\n\n”+“SDK:`+Build.VERSION.SDK_INT+”`\n域名:`”+
Build.VERSION.CODENAME+“`\n请:`+Build.VERSION.RELEASE+
`\n设备:`+Build.DEVICE+`\n硬件:`+Build.HARDWARE+
“`\n制造商:`+Build.MANUFACTURER+”`\n模型:`+Build.MODEL+
“`\n产品:`+Build.PRODUCT+((getRadio()==null)?”“:(`\n Radio:`+getRadio())”+
“`\nBRAND:`+Build.BRAND+((Build.VERSION.SDK\u INT>=8)?(`\nBOOTLOADER:`+Build.BOOTLOADER):”“)+
“`\n板:`+Build.BOARD+”`\nID:`+Build.ID+“`\n\n”+
ReflectionUtils.dumpClass(SignalStrength.class,mSignalStrength)+“\n”+
ReflectionUtils.dumpClass(mCellLocation.getClass(),mCellLocation)+“\n”+getWimaxDump()+
ReflectionUtils.dumpClass(TelephonyManager.class,mManager)+
ReflectionUtils.dumpStaticFields(Context.class,getApplicationContext());
返回null;
}
受保护的void onProgressUpdate(void…progress)
{
//什么也不做。。。
}
受保护的void onPostExecute(void结果)
{
完全();
}
}
私人最终作废完成()
{
mDone=true;
尝试
{
mText.setText(mTextStr);
//别听了。
mManager.listen(mListener,PhoneStateListener.listen\u NONE);
Toast.makeText(getApplicationContext(),R.string.done,Toast.LENGTH\u SHORT.show();
mSubmit.setEnabled(true);
}
捕获(例外e)
{
Log.e(标记“ERROR!!!”,e);
}
}
私有最终无效更新()
{
if(mSignalStrength==null | | mCellLocation==null)返回;
最终ReflectionTask mTask=新ReflectionTask();
import java.lang.reflect.*;
import android.util.Log;

public final class ReflectionUtils
{
        public static final String TAG = ReflectionUtils.class.getSimpleName();

        /**
         * Dumps a {@link Class}'s {@link Method}s and {@link Field}s
         * as a String.
         */
        public static final String dumpClass(Class<?> mClass, Object mInstance)
        {
                if (mClass == null || mInstance == null) return null;

                String mStr = mClass.getSimpleName() + "\n\n";

                mStr += "FIELDS\n\n";

                final Field[] mFields = mClass.getDeclaredFields();

                for (final Field mField : mFields)
                {
                        mField.setAccessible(true);

                        mStr += mField.getName() + " (" + mField.getType() + ") = ";

                        try
                        {
                                mStr += mField.get(mInstance).toString();
                        }
                        catch (Exception e)
                        {
                                mStr += "null";
                                Log.e(TAG, "Could not get Field `" + mField.getName() + "`.", e);
                        }

                        mStr += "\n";
                }

                mStr += "METHODS\\nn";

                // Dump all methods.

                final Method[] mMethods = mClass.getMethods();

                for (final Method mMethod : mMethods)
                {
                        mMethod.setAccessible(true);

                        mStr += mMethod.getReturnType() + " " + mMethod.getName() + "() = ";

                        try
                        {
                                final Object mRet = mMethod.invoke(mInstance);
                                mStr += (mRet == null) ? "null" : mMethod.invoke(mInstance).toString();
                        }
                        catch (Exception e)
                        {
                                mStr += "null";
                                Log.e(TAG, "Could not get Method `" + mMethod.getName() + "`.", e);
                        }

                        mStr += "\n";
                }

                return mStr;
        }

        /**
         * @return A string containing the values of all static {@link Field}s.
         */
        public static final String dumpStaticFields(Class<?> mClass, Object mInstance)
        {
                if (mClass == null || mInstance == null) return null;

                String mStr = mClass.getSimpleName() + "\n\n";

                mStr += "STATIC FIELDS\n\n";

                final Field[] mFields = mClass.getDeclaredFields();

                for (final Field mField : mFields)
                {
                        if (ReflectionUtils.isStatic(mField))
                        {
                                mField.setAccessible(true);

                                mStr += mField.getName() + " (" + mField.getType() + ") = ";

                                try
                                {
                                        mStr += mField.get(mInstance).toString();
                                }
                                catch (Exception e)
                                {
                                        mStr += "null";
                                        Log.e(TAG, "Could not get Field `" + mField.getName() + "`.", e);
                                }

                                mStr += "\n";
                        }
                }

                return mStr;
        }

        /**
         * @return True if the {@link Field} is static.
         */
        public final static boolean isStatic(Field field)
        {
            final int modifiers = field.getModifiers();
            return (Modifier.isStatic(modifiers));
    }
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:background="@android:color/black"
        android:padding="8dp"
        android:id="@+id/root">
        <ScrollView
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="56dp"
                android:fillViewport="true">
                <LinearLayout
                        android:orientation="vertical"
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent">
                        <TextView  
                                android:layout_width="fill_parent" 
                                android:layout_height="wrap_content" 
                                android:id="@+id/text"
                                android:textColor="@android:color/white" />
                </LinearLayout>
        </ScrollView>
        <TableLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:stretchColumns="0,1">
                <TableRow
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content">  
                        <Button
                                android:id="@+id/cancel"
                                android:layout_width="fill_parent"
                                android:layout_height="wrap_content"
                                android:text="@string/cancel"
                                android:textColor="@android:color/white"/>
                        <Button
                                android:id="@+id/submit"
                                android:layout_width="fill_parent"
                                android:layout_height="wrap_content"
                                android:text="@string/submit"
                                android:textColor="@android:color/white"/>
                </TableRow>
        </TableLayout>
</RelativeLayout>
    <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.location" android:required="false" />
    <uses-feature android:name="android.hardware.location.network" android:required="false" />
    <uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />

<uses-permission android:name="android.permission.ACCESS_WIMAX_STATE" android:required="false" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" android:required="false" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:required="false" />