2013-04-29 37 views
0

我正在研究gps跟蹤器應用程序。我的應用程序應該在後臺工作,並且不應該在菜單中顯示給用戶。所以基本上會發生什麼,它會在php服務器上發佈緯度和經度值。而且我的應用程序應該從早上9點手動啓動和停止,晚上9點沒有與用戶的互動..我使用廣播接收器和服務,使我的應用程序運行在後臺我傳遞一個意圖從接收器到服務類和問題是我的服務類不叫GPS跟蹤器服務類不會在我的應用程序中調用

這裏是我的代碼。對於廣播接收機

public class MainActivity extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 
    Toast.makeText(context, "MyReceiver Started"+intent.getAction(), Toast.LENGTH_SHORT).show(); 
    Intent myIntent=new Intent(context,GPSTRACKER.class); 
    context.startService(myIntent);  
    }} 

這裏是服務code..GPSTRACKER

public class GPSTracker extends Service implements LocationListener { 
private static String url_create_product = "http://testingicon.com/gps.php"; 
private static final String TAG_SUCCESS = "success"; 
JSONparser1 jsonParser2=new JSONparser1(); 
private final Context mContext; 
boolean isGPSEnabled = false; 
boolean isNetworkEnabled = false; 
boolean canGetLocation = false; 
Location location; // location 
double latitude; // latitude 
double longitude; // longitude 
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1;//1 meter 
private static final long MIN_TIME_BW_UPDATES = 5000;//30 
protected LocationManager locationManager; 
private static final String TAG = "BroadcastGPSService"; 
public static final String BROADCAST_ACTION = "com.example.gpstracking.display"; 
private final Handler handler = new Handler(); 
Intent intent; 
int counter = 0;  
int hour,min,year,month,day; 
GeoPoint gp; 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    intent = new Intent(BROADCAST_ACTION); 
} 
public GPSTracker(Context context) {  
    this.mContext = context; 
    getLocation(); 
    } 
public Location getLocation() { 
    try { 
     locationManager = (LocationManager) mContext 
       .getSystemService(LOCATION_SERVICE); 
     // getting GPS status 
     isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 
     // getting network status 
     isNetworkEnabled = locationManager 
       .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
     if (!isGPSEnabled && !isNetworkEnabled) { 
      // no network provider is enabled 
     } else { 
      this.canGetLocation = true; 
      if (isNetworkEnabled) { 
       locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 
         MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
       Log.d("Network", "Network"); 
       if (locationManager != null) { 
        location = locationManager 
          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if (location != null) { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude();}}} 
      // if GPS Enabled get lat/long using GPS Services 
      if (isGPSEnabled) { 
       if (location == null) { 
        locationManager.requestLocationUpdates(
          LocationManager.GPS_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("GPS Enabled", "GPS Enabled"); 
        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
    }}}}}} catch (Exception e) {e.printStackTrace();}return location;} 
    @Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    // handler.removeCallbacks(sendUpdatesToUI);  
    super.onDestroy();} 
/** 
* Stop using GPS listener 
* Calling this function will stop using GPS in your app 
* */ 
public void stopUsingGPS(){ 
    if(locationManager != null){ 
     locationManager.removeUpdates(GPSTracker.this);}} 
/** 
* Function to get latitude 
* */ 
public double getLatitude(){ 
    if(location != null){ 
     latitude = location.getLatitude();} 
    // return latitude 
    return latitude;} 
/** 
* Function to get longitude 
* */ 
public double getLongitude(){ 
    if(location != null){ 
     longitude = location.getLongitude();} 
    // return longitude 
    return longitude;} 
/** 
* Function to check GPS/wifi enabled 
* @return boolean 
* */ 
public boolean canGetLocation() { 
    return this.canGetLocation; 
} 
/** 
* Function to show settings alert dialog 
* On pressing Settings button will lauch Settings Options 
* */ 
public void showSettingsAlert(){ 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 
    // Setting Dialog Title  
    alertDialog.setTitle("GPS is settings"); 
    // Setting Dialog Message 
    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 
    // On pressing Settings button 
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog,int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      mContext.startActivity(intent); 
     }}); 
    // on pressing cancel button 
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
     dialog.cancel();}}); 
    // Showing Alert Message 
    alertDialog.show(); 
} 
@Override 
public void onLocationChanged(Location location) { 
    //getLocation(); 
    latitude=location.getLatitude(); 
    longitude=location.getLongitude(); 
    gp = new GeoPoint((int)(latitude*1000000), (int)(longitude*1000000));   

    String address = ConvertPointToLocation(gp); 
    String locationname = address.substring(0,address.length()); 

    Date date = new Date(); 
    //formatting time to have AM/PM text using 'a' format 

    String strDateFormat = "HH:mm:ss a"; 
    SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat); 
    String time=sdf.format(date); 
    String device_id=getdeviceid(mContext); 
    System.out.println("Time with AM/PM field : " + time); 

    System.out.println("Location changed is.................. "+latitude+longitude + "Time is "+time +"Date is "+date); 
    Toast.makeText(mContext, "Location changed is.................. "+"Latitude " +latitude+ "Logitude "+longitude + "Time is "+time +"Date is "+date, Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "entered DisplayLoggingInfo"+ " Time is "+time+ "Date is "+ date + "Device Id iss "+device_id); 

    String str1=String.valueOf(longitude); 
    String str2=String.valueOf(latitude); 

    // here is the code for Posting values on PHP server  
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("longitude", str1)); 
    params.add(new BasicNameValuePair("latitude", str2)); 
    params.add(new BasicNameValuePair("time", time)); 
    params.add(new BasicNameValuePair("device_id", device_id)); 
    params.add(new BasicNameValuePair("location_name", locationname)); 

    JSONArray json1=jsonParser2.makeHttpRequest(url_create_product, "POST",   params); 
    // check log cat fro response 
    // Log.d("Create Response", json.toString()); 
    // check for success tag 
    /* try { 
     int success = json1.getInt(TAG_SUCCESS); 
     if (success == 1) { 
      // successfully created product 
      // closing this screen 
     } else { 
      // failed to create product 
     }} catch (JSONException e) { 
     e.printStackTrace();}*/ 
    //db code 
} 
private String ConvertPointToLocation(GeoPoint gp2) { 
    // TODO Auto-generated method stub 
    String address = ""; 
    Geocoder geoCoder = new Geocoder(mContext, Locale.getDefault()); 
    try { 
     List<Address> addresses = geoCoder.getFromLocation(gp2.getLatitudeE6()/1E6, gp2.getLongitudeE6()/1E6, 1); 
     if (addresses.size() > 0) { 
      for (int index = 0; index < addresses.get(0).getMaxAddressLineIndex(); index++) 
       address += addresses.get(0).getAddressLine(index) + " ";}} 
    catch (IOException e) {     
     e.printStackTrace();} 
    return address;} 
protected String getdeviceid(Context context2) { 
    // TODO Auto-generated method stub 
    TelephonyManager manager = (TelephonyManager)context2.getSystemService(Context.TELEPHONY_SERVICE); 
     String deviceId; 
     if (manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) { 
      //Tablet 
      deviceId = Secure.getString(this.getContentResolver(), 
        Secure.ANDROID_ID); 
     } else { 
      //Mobile 
      deviceId = manager.getDeviceId(); 
     } 
     return deviceId; 
     } 
    @Override 
public void onProviderDisabled(String provider) { 
} 
@Override 
public void onProviderEnabled(String provider) { 
} 
@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
} 
@Override 
public IBinder onBind(Intent arg0) { 
    return null;}} 

這裏是清單文件

  <?xml version="1.0" encoding="utf-8"?> 
      <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.websmithing.broadcasttest" 
       android:versionCode="1" 
     android:versionName="1.0" > 
     <uses-sdk android:minSdkVersion="8" 
android:targetSdkVersion="17" /> 
<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" > 
    <receiver 
android:enabled="true" 
android:name=".MainActivity"> 
<!-- <intent-filter> 
    <action android:name = "com.websmithing.broadcasttest.BroadcastService"/> 
     </intent-filter> --> 
     </receiver> 
     <service android:name=".GPSTRACKER" /> 
     </application> 

     </manifest> 

回答

0

1:您可以使用AlarmManager隨後的PendingIntent。

OR

檢查this link。 希望它能幫助你。

相關問題