Android 尝试使用电话类获取单元格位置时发生ClassCastExeption错误

Android 尝试使用电话类获取单元格位置时发生ClassCastExeption错误,android,location,telephony,Android,Location,Telephony,我从同一个用户那里收到了一些关于Google Play的关于CdmaCellLocation的报告: java.lang.ClassCastException: android.telephony.cdma.CdmaCellLocation 这是一项使用Cell Network报告用户位置的服务,请注意,它100%适用于我,我没有关于此错误的任何其他报告,以下是onStart的代码: public class ServiceLocation extends Service{ int my

我从同一个用户那里收到了一些关于Google Play的关于CdmaCellLocation的报告:

 java.lang.ClassCastException: android.telephony.cdma.CdmaCellLocation
这是一项使用Cell Network报告用户位置的服务,请注意,它100%适用于我,我没有关于此错误的任何其他报告,以下是onStart的代码:

  public class ServiceLocation extends Service{
int myLatitude , myLongitude;
private String str2;    
static SharedPreferences prefs;
private String numtosend;

public int onStartCommand(Intent itn,int num1, int num2){

     prefs = getSharedPreferences("Preferences", 
             Context.MODE_PRIVATE);

        if(isAirplaneModeOn(this)){
            stopSelf();
        }


    Bundle extras = itn.getExtras();

     if(extras.containsKey("ExtraName") != true){
     str2 = itn.getStringExtra("Number");
     }
     location(str2);

     return 0;


   }
此处显示位置方法代码:

 public void location(String num){
    // TODO Auto-generated method stub



     TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
     if(telephonyManager.getSimState() != TelephonyManager.SIM_STATE_ABSENT){
     numtosend = "Phone Number (If Avaible) : " + " " + telephonyManager.getLine1Number() + "  " + " Sim Serial : " + telephonyManager.getSimSerialNumber() + "  " + "IMEI : " + telephonyManager.getDeviceId();
     }
     else {
         numtosend = this.getResources().getString(R.string.txtNoSimCard) + telephonyManager.getDeviceId();
     }
     GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();


        int cid = cellLocation.getCid();
        int lac = cellLocation.getLac();

        if(RqsLocation(cid, lac)){




      if(str2.equals("") != true && str2.equals(null) != true) {
      SmsManager.getDefault().sendTextMessage(num, null, this.getResources().getString(R.string.txtGPSPosition) + "(40-250 Meters Accuracy) : "+"http://maps.google.com/?q="+String.valueOf((float)myLatitude/1000000) +","+String.valueOf((float)myLongitude/1000000), null, null);

        }


        if(gmailaccount.equals("") != true && gmailpass.equals(null) != true){



                 P m = new P(gmailaccount , gmailpass);

                             String[] Mail = {mail};
                             m.setTo(Mail);
                             m.setFrom("AnonymousMail@gmail.com"); 
                             m.setSubject("Location");
                             m.setBody(this.getResources().getString(R.string.txtGPSPosition) + "(~300 Meters Accuracy) : " + "http://maps.google.com/?q="+String.valueOf((float)myLatitude/1000000) +","+String.valueOf((float)myLongitude/1000000) + " " + str2 + "  " + numtosend); 

                             try {
                                if(m.send()){
                                     stopSelf();
                                 }
                                else {

                                     if(str2.equals("") != true) {
                                            SmsManager.getDefault().sendTextMessage(str2, null, "Impossible to Send a Message to your Emergency Mail Address !", null, null);
                                                 }
                                     stopSelf();
                                }
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }



    }

        }

      else{
          if(str2.equals("") != true && str2.equals(null) != true) {
            SmsManager.getDefault().sendTextMessage(num, null, this.getResources().getString(R.string.txtInternetOffLocation), null, null);
          }

          if(gmailaccount.equals("") != true && gmailpass.equals(null) != true){
             P m = new P(gmailaccount , gmailpass);

                         String[] Mail = {mail};
                         m.setTo(Mail);
                         m.setFrom("AnonymousMail@gmail.com"); 
                         m.setSubject("Location");
                                m.setBody(this.getResources().getString("Internet Off)); 

                         try {
                            if(m.send()){
                                 stopSelf();
                             }
                            else {

                                 if(str2.equals("") != true) {

                                             }
                                 stopSelf();
                            }
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
          }

          }



        stopSelf();

}
最后是Google Play的日志:

   java.lang.RuntimeException: Unable to start service com.xxx.xxx.xxx.ServiceLocation@4051b930 with Intent {            cmp=com.xxx.xxx.xxx/.ServiceLocation (has extras) }: java.lang.ClassCastException:                 android.telephony.cdma.CdmaCellLocation
   at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2052)
   at android.app.ActivityThread.access$2800(ActivityThread.java:117)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:994)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:130)
   at android.app.ActivityThread.main(ActivityThread.java:3683)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:507)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633)
   at dalvik.system.NativeStart.main(Native Method)
   Caused by: java.lang.ClassCastException: android.telephony.cdma.CdmaCellLocation
   at com.xxx.xxx.xxx.ServiceLocation.location(ServiceLocation.java:83)
   at com.xxx.xxx.xxx.ServiceLocation.onStartCommand(ServiceLocation.java:53)
   at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2039)
  ... 10 more
你认为这是手机供应商的问题吗?或者如果它来自平板电脑

[主题外]顺便问一下,我在哪里以及如何报告:

GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();
这是一个不安全的演员阵容。代码假定此方法将始终返回GsmCellLocation的实例,但事实并非如此。有两种类型的蜂窝网络。GSM和CDMA

如果手机在CDMA网络上运行,则getCellLocation将返回CdmaCellLocation的实例

您可以调用telephonyManager.getPhoneType以获取有关设备使用的无线电类型的信息。此方法将返回四个值之一:

PHONE_TYPE_NONE-该设备没有蜂窝无线电。例如,它可能是没有3G调制解调器的平板电脑。getCellLocation将返回null

电话类型\u GSM-该设备具有GSM收音机。您可以安全地调用GsmCellLocation telephonyManager.getCellLocation

电话\u类型\u CDMA-该设备具有GSM无线电。您可以安全地调用CdmaCellLocation telephonyManager.getCellLocation

电话\类型\ SIP-设备正在使用SIP会话启动协议进行通信。getCellLocation将返回null

这是一个不安全的演员阵容。代码假定此方法将始终返回GsmCellLocation的实例,但事实并非如此。有两种类型的蜂窝网络。GSM和CDMA

如果手机在CDMA网络上运行,则getCellLocation将返回CdmaCellLocation的实例

您可以调用telephonyManager.getPhoneType以获取有关设备使用的无线电类型的信息。此方法将返回四个值之一:

PHONE_TYPE_NONE-该设备没有蜂窝无线电。例如,它可能是没有3G调制解调器的平板电脑。getCellLocation将返回null

电话类型\u GSM-该设备具有GSM收音机。您可以安全地调用GsmCellLocation telephonyManager.getCellLocation

电话\u类型\u CDMA-该设备具有GSM无线电。您可以安全地调用CdmaCellLocation telephonyManager.getCellLocation


电话\类型\ SIP-设备正在使用SIP会话启动协议进行通信。getCellLocation将返回null。

研究此问题,您可以使用TelephonyManager类的getPhoneType确定电话类型

我会尝试以下方法:

switch( telephonyManager.getPhoneType() ) {

    case PHONE_TYPE_GSM: {
         // Handle GSM phone
         GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();
         break;
    }
    case PHONE_TYPE_CDMA: {
         // Handle CDMA phone
         CdmaCellLocation cellLocation = (CdmaCellLocation) telephonyManager.getCellLocation();
         break;
    }
    default: {
        // can't do cell location
    }

研究这一点,您可以使用TelephonyManager类的getPhoneType确定电话类型

我会尝试以下方法:

switch( telephonyManager.getPhoneType() ) {

    case PHONE_TYPE_GSM: {
         // Handle GSM phone
         GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();
         break;
    }
    case PHONE_TYPE_CDMA: {
         // Handle CDMA phone
         CdmaCellLocation cellLocation = (CdmaCellLocation) telephonyManager.getCellLocation();
         break;
    }
    default: {
        // can't do cell location
    }

这是GsmCellLocation cellLocation=GsmCellLocation telephonyManager.getCellLocation;行ServiceLocation.locationServiceLocation.java:83?您是否在CDMA手机上测试了您的应用程序?是的,不,我不认为,我没有CDMA手机。我的猜测是,您需要确定它是哪种类型的手机,如果该设备是CDMA手机和您现有的GSM手机代码,则需要使用它。是的,如果这是CDMA手机,我将致电stopSelf,谢谢您的回答。关于屏幕?你是指屏幕截图中显示的错误报告中的亵渎吗?我真的不能回答这个问题,因为我对Android编程非常陌生,而且我还没有向Google Play发布任何应用程序。我的直觉是这可能不值得努力。如果你不打算支持CDMA手机,你应该在商店的帖子里写一条免责声明,以尽量减少挫折感。你有没有可能为CDMA手机添加CDMA码?您应该签出以测试您的GSM代码。这是GsmCellLocation cellLocation=GsmCellLocation telephonyManager.getCellLocation;行ServiceLocation.locationServiceLocation.java:83?您是否在CDMA手机上测试了您的应用程序?是的,不,我不认为,我没有CDMA手机。我的猜测是,您需要确定它是哪种类型的手机,如果该设备是CDMA手机和您现有的GSM手机代码,则需要使用它。是的,如果这是CDMA手机,我将致电stopSelf,谢谢您的回答。关于屏幕?你是指屏幕截图中显示的错误报告中的亵渎吗?我真的不能回答这个问题,因为我对Android编程非常陌生,而且我还没有向Google Play发布任何应用程序。我的直觉是这可能不值得努力。如果你不打算支持CDMA手机,你应该在商店的帖子里写一条免责声明,以尽量减少挫折感。你有没有可能为CDMA手机添加CDMA码?您应该结帐测试您的GSM代码。谢谢,这回答了我的问题。谢谢,这回答了我的问题。还有:
CDMA cid=cellLocation.getBaseStationLatitude;lac=cellLocation.GetBaseStationLongLevel;==此GSM cid=cellLocation.getCid;lac=cellLocation.getLac?我认为您的代码缺少每个案例末尾的break语句-这是:CDMA cid=cellLocation.getBaseStationLatitude;lac=cellLocation.GetBaseStationLongLevel;==此GSM cid=cellLocation.getCid;lac=cellLocation.getLac?我认为您的代码缺少每个案例末尾的break语句-