android服务在2.2版中工作,但在更高版本中失败

android服务在2.2版中工作,但在更高版本中失败,android,Android,大家好,如果我在这里遇到了问题,我会提前道歉,但我对android的开发还很陌生 情况是 我已经建立了一个简单的gps跟踪应用程序。基本上,用户可以单击紧急按钮、检查按钮或短信来激活服务。 在版本2.2中一切都很好,这是我在构建中的目标,但在运行2.3.4的htc上测试时,只要有任何函数调用该服务,该应用程序就会崩溃 简而言之,服务会检查数据库中的用户pin,这里是Pinbox_db 然后它获取gps位置,一旦收到,就会向web服务发出http调用,以发布设备的long和lat 再次,我很抱歉,

大家好,如果我在这里遇到了问题,我会提前道歉,但我对android的开发还很陌生

情况是 我已经建立了一个简单的gps跟踪应用程序。基本上,用户可以单击紧急按钮、检查按钮或短信来激活服务。 在版本2.2中一切都很好,这是我在构建中的目标,但在运行2.3.4的htc上测试时,只要有任何函数调用该服务,该应用程序就会崩溃

简而言之,服务会检查数据库中的用户pin,这里是Pinbox_db 然后它获取gps位置,一旦收到,就会向web服务发出http调用,以发布设备的long和lat

再次,我很抱歉,如果这对你来说是微不足道的,更有经验的开发人员,但我在非常新的领域,并感谢你的反馈

这是我的服务代码

  package com.artgraven.misafety;


  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;

  import org.apache.http.HttpResponse;
  import org.apache.http.NameValuePair;
  import org.apache.http.client.ClientProtocolException;
  import org.apache.http.client.HttpClient;   
  import org.apache.http.client.entity.UrlEncodedFormEntity;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.apache.http.message.BasicNameValuePair;

  import android.app.Service;
  import android.content.Context;
  import android.content.Intent;
  import android.location.Location;
  import android.location.LocationManager;
  import android.net.ConnectivityManager;
  import android.os.Bundle;
  import android.os.IBinder;
  import android.telephony.TelephonyManager;
  import android.util.Log;
  import android.widget.Toast;


  public class Bg_process extends Service {
private static final String TAG = "BOOMBOOMTESTGPS";
private LocationManager mLocationManager = null;
private static final int LOCATION_INTERVAL = 1500;
private static final float LOCATION_DISTANCE = 20f;
public static String b_c_long;
public static String b_c_lat;
public static String alert_pin = "", alert_type ="undefined", alert_device ="android", alert_imei="32154",alert_sim_serial="0796768445";
private Pinbox_db entry = new Pinbox_db(Bg_process.this);
public static String recordSet = "PIN";

private class LocationListener implements android.location.LocationListener{
    Location mLastLocation;
    public LocationListener(String provider)
    {
        Log.e(TAG, "LocationListener " + provider);
        mLastLocation = new Location(provider);

    }
    public void onLocationChanged(Location location)
    {
        Log.e(TAG, "onLocationChanged: " + location);
        mLastLocation.set(location);
        String message = String.format(
                "New Location \n Longitude: %1$s \n Latitude: %2$s",
                location.getLongitude(), location.getLatitude());

        Toast.makeText(Bg_process.this, message, Toast.LENGTH_LONG).show();

        b_c_long = Double.toString(location.getLongitude());
        b_c_lat = Double.toString(location.getLatitude());

        postData();

    }
    public void onProviderDisabled(String provider)
    {
        Log.e(TAG, "onProviderDisabled: " + provider);            
    }

    public void onProviderEnabled(String provider)
    {
        Log.e(TAG, "onProviderEnabled: " + provider);
    }

    public void onStatusChanged(String provider, int status, Bundle extras)
    {
        Log.e(TAG, "onStatusChanged: " + provider);
    }
} 
LocationListener[] mLocationListeners = new LocationListener[] {
        new LocationListener(LocationManager.GPS_PROVIDER),
        new LocationListener(LocationManager.NETWORK_PROVIDER)

};


@Override
public IBinder onBind(Intent arg0)
{
    return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.e(TAG, "onStartCommand");
     super.onStartCommand(intent, flags, startId);       
    Bundle extras = intent.getExtras();
   // alert_type = intent.getStringExtra("code");
    alert_type = extras.getString("code");


    return START_STICKY;


}
@Override
public void onCreate()
{   
    // get pin
    entry.open();
    recordSet = entry.getPin();
    entry.close();
    alert_pin = recordSet;

    TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);

     ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        if(cm.getActiveNetworkInfo().getTypeName().equals("MOBILE"))
            alert_device = "android:  cellnetwork/3G";
        else if(cm.getActiveNetworkInfo().getTypeName().equals("WIFI"))
            alert_device = "android: wifi";
        else 
            alert_device ="android: na"; 

        alert_sim_serial = tm.getLine1Number();
        alert_imei = tm.getDeviceId();



    Log.e(TAG, "onCreate");
    initializeLocationManager();
    try {
        mLocationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                mLocationListeners[0]);


    } catch (java.lang.SecurityException ex) {
        Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "network provider does not exist, " + ex.getMessage());
    }
    try {
        mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                mLocationListeners[1]);
    } catch (java.lang.SecurityException ex) {
        Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "gps provider does not exist " + ex.getMessage());
    }
}

@Override
public void onDestroy()
{
    Log.e(TAG, "onDestroy");
    super.onDestroy();
    if (mLocationManager != null) {
        for (int i = 0; i < mLocationListeners.length; i++) {
            try {
                mLocationManager.removeUpdates(mLocationListeners[i]);
            } catch (Exception ex) {
                Log.i(TAG, "fail to remove location listners, ignore", ex);
            }
        }
    }
} 
public static void postData() {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://www.website.co.za/api/activity_log.php");
    try {
        // Add your data
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("alert_long", b_c_long));
        nameValuePairs.add(new BasicNameValuePair("alert_lat", b_c_lat));
        nameValuePairs.add(new BasicNameValuePair("alert_pin", alert_pin));
        nameValuePairs.add(new BasicNameValuePair("alert_type", alert_type));
        nameValuePairs.add(new BasicNameValuePair("alert_device", alert_device));
        nameValuePairs.add(new BasicNameValuePair("alert_imei", alert_imei));
        nameValuePairs.add(new BasicNameValuePair("alert_sim_serial", alert_sim_serial));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }
}
private void initializeLocationManager() {
    Log.e(TAG, "initializeLocationManager");
    if (mLocationManager == null) {
        mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        Location location = mLocationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (location != null) {
            String message = String.format(
                    "Current Location \n Longitude: %1$s \n Latitude: %2$s",
                    location.getLongitude(), location.getLatitude());
            Toast.makeText(Bg_process.this, " " + message, Toast.LENGTH_LONG).show();

            b_c_long = Double.toString(location.getLongitude());
            b_c_lat = Double.toString(location.getLatitude());

            postData();

        } else {
            Toast.makeText(Bg_process.this, "current location unavailable",
                    Toast.LENGTH_LONG).show();

        }
    }
}

} 
此更新的logcat来自更高的api版本(15) 在实现建议的答案后,问题在模拟器上得到了解决,但在设备上进行测试时,会出现以下错误

12-08 18:12:47.360: W/dalvikvm(21432): threadid=1: thread exiting with uncaught exception (group=0x401b1760)
12-08 18:12:47.360: E/AndroidRuntime(21432): FATAL EXCEPTION: main
12-08 18:12:47.360: E/AndroidRuntime(21432): java.lang.RuntimeException: Unable to create service com.artgraven.specialopstech.Bg_process: android.os.NetworkOnMainThreadException
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2049)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.app.ActivityThread.access$2500(ActivityThread.java:122)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1059)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.os.Looper.loop(Looper.java:132)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.app.ActivityThread.main(ActivityThread.java:4028)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at java.lang.reflect.Method.invokeNative(Native Method)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at java.lang.reflect.Method.invoke(Method.java:491)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at dalvik.system.NativeStart.main(Native Method)
12-08 18:12:47.360: E/AndroidRuntime(21432): Caused by: android.os.NetworkOnMainThreadException
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at java.net.InetAddress.getAllByName(InetAddress.java:249)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at com.artgraven.specialopstech.Bg_process.postData(Bg_process.java:192)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at com.artgraven.specialopstech.Bg_process.initializeLocationManager(Bg_process.java:215)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at com.artgraven.specialopstech.Bg_process.onCreate(Bg_process.java:138)
12-08 18:12:47.360: E/AndroidRuntime(21432):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2039)
12-08 18:12:47.360: E/AndroidRuntime(21432):    ... 10 more

较新的操作系统版本在检测到您正在犯“用户体验”错误时会抛出错误。在UI线程上进行网络通信就是其中之一,这就是您的logcat所显示的。您可以通过将流量放在单独的线程中来避免这种情况:

Thread thread = new Thread(new Runnable() {
    public void run() {
        // Net traffic here
    }
});
thread.start();
您可以在该线程上调用整个
postData()
,如下所示:

public void onLocationChanged(Location location)
{
    Log.e(TAG, "onLocationChanged: " + location);
    mLastLocation.set(location);
    String message = String.format(
            "New Location \n Longitude: %1$s \n Latitude: %2$s",
            location.getLongitude(), location.getLatitude());

    Toast.makeText(Bg_process.this, message, Toast.LENGTH_LONG).show();

    b_c_long = Double.toString(location.getLongitude());
    b_c_lat = Double.toString(location.getLatitude());

    Thread thread = new Thread(new Runnable() {
      public void run() {
        postData();
      }
    });
    thread.start();
}

希望这有帮助

日志猫中会出现什么错误?
?我看到正在更改LocationManager.NETWORK\u提供程序、LOCATION\u间隔、LOCATION\u距离、mLocationListeners[0]);改为LocationManager.NETWORK_PROVIDER、LOCATION_INTERVAL、LOCATION_DISTANCE、mLocationListeners[1]);可能有用thoughts@JacquesArtgraven在你的问题中加入完整的错误日志。最好能从崩溃中看到日志堆栈跟踪(对于大多数崩溃,如果你看不到它,你会通过ADB看到,根据我的经验,这可能是内存问题),但我注意到你没有检查
Intent
是否为
null
,有时的确如此。我怀疑这是你的问题,但请随意尝试。嘿@andrewyld我更新了日志猫谢谢你的洞察力,我注意到强制关闭了指针
public void onLocationChanged(Location location)
{
    Log.e(TAG, "onLocationChanged: " + location);
    mLastLocation.set(location);
    String message = String.format(
            "New Location \n Longitude: %1$s \n Latitude: %2$s",
            location.getLongitude(), location.getLatitude());

    Toast.makeText(Bg_process.this, message, Toast.LENGTH_LONG).show();

    b_c_long = Double.toString(location.getLongitude());
    b_c_lat = Double.toString(location.getLatitude());

    Thread thread = new Thread(new Runnable() {
      public void run() {
        postData();
      }
    });
    thread.start();
}