2012-06-14 3 views
1

Я видел много ответов на этот вопрос, но это не связано с моей задачей. Я пытаюсь получить местоположение gps в фоновом режиме, но я получил исключение как Cant Create Handler Inside Thread That Has Not Called Looper Prepare in Android в mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);.Как получить GPS-местоположение с помощью AsyncTask?

public class GPSLocation extends AsyncTask<Void, Void, Void> 
    { 
     @Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 
      progressDialog = new ProgressDialog(RoadMaintenanceActivity.this); 
      progressDialog.setCancelable(true); 
      progressDialog.setMessage("Getting GPS Location..."); 
      progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      progressDialog.setProgress(1); 
      progressDialog.show(); 

     } 
     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
      // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
     } 

     @Override 
     protected void onPostExecute(Void result) 
     { 

       progressDialog.cancel(); 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 

      boolean isGps = false; 

      while(!isGps) 
      { 
       LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
       LocationListener mlocListener = new MyLocationListener(); 
       mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
       if(longitude !=0 && latitude!=0) 
       { 
        isGps = true; 
        sendSMS(); 
       } 
      } 

      return null; 


     } 

    } 

Я не уверен, почему мы не можем назвать это внутри метода doBackground().

Спасибо за помощь.

ответ

5

Наконец я понял, проблема, я думаю, что это поможет кто-то вроде меня

public class GPSLocation extends AsyncTask<Void, Void, Void> 
    { 
     boolean running =true; 
       @Override 
       protected void onPreExecute() 
       { 
        super.onPreExecute(); 
        progressDialog = new ProgressDialog(RoadMaintenanceActivity.this); 
        progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
          public void onCancel(DialogInterface dialog) { 
           getgps.cancel(true); 
          } 
        }); 
        LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
        LocationListener mlocListener = new MyLocationListener(); 
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);  
        progressDialog.setCancelable(true); 
        progressDialog.setMessage("Getting GPS Location..."); 
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        progressDialog.setProgress(1); 
        progressDialog.show(); 

       } 

       @Override 
       protected void onProgressUpdate(Void... values) { 
        super.onProgressUpdate(values); 
        // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
       } 

       @Override 
       protected void onPostExecute(Void result) 
       { 
         progressDialog.cancel(); 
       } 

       @Override 
       protected Void doInBackground(Void... params) { 
        boolean isDataSubmitted = false; 

        while(!isDataSubmitted) 
        { 
         if(longitude !=0 && latitude!=0) 
         { 
          sendSMS(); 
          isDataSubmitted = true; 
         } 
        } 

        return null;  
       } 
    } 

Имея Locationmanager в onPreExecute() исключение изжить из моего приложения. Мы можем получить gps в onpreexecute, а не doinbackground().

3

Вы не можете этого сделать. Для использования mlocListener требуется поток Looper.

в doInBackground Вызов Looper.prepare();

Так что ваш код будет что-то вроде этого.

@Override 
     protected Void doInBackground(Void... params) { 
      Looper.myLooper().prepare(); 
      boolean isGps = false; 
      ----------------- 
+0

Спасибо за ваш ответ на самом деле я решил эту проблему .. теперь его другие один 'SmsManager smsManager = SmsManager.getDefault(); \t \t \t \t \t \t \t \t \t \t smsManager.sendTextMessage (sms_phonenumber, нулевое, сообщение, sentPI, NULL); 'его говорит исключение null указателя .. У вас есть какие-либо идеи об этом ... спасибо – GoCrazy

+0

Вы должны создать новый вопрос с вашей последней ошибкой, потому что трудно решить проблемы, которые мы не можем видеть. – Guardanis

+0

@cruceo Спасибо за ваш комментарий .. Я решил проблему .. – GoCrazy

1

Это похоже на то, что я пытаюсь сделать в данный момент. Вы можете показать мне полный источник? Я в настоящее время он работал в мой код, но я хотел бы посмотреть, как вы получаете GPS кооперативов ords и запуск асинхр

ProgressDialog progressDialog; 
double longitude, latitude; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_confirm_screen); 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    Boolean locationCheck = sp.getBoolean("LOCATION", false); 
    if(locationCheck){ 

    } 
    else 
    { 
    sendEmail(); 
    playSound(); 
    } 

} 

public class GPSLocation extends AsyncTask<Void, Void, Void> 
{ 
    boolean running =true; 
      @Override 
      protected void onPreExecute() 
      { 
       super.onPreExecute(); 
       progressDialog = new ProgressDialog(ConfirmScreen.this); 
       progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
         public void onCancel(DialogInterface dialog) { 
          getgps.cancel(true); 
         } 
       }); 

       LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
       LocationListener mlocListener = new MyLocationListener(); 
       mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);  
       progressDialog.setCancelable(true); 
       progressDialog.setMessage("Getting GPS Location..."); 
       progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
       progressDialog.setProgress(1); 
       progressDialog.show(); 

      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       super.onProgressUpdate(values); 
       // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
      } 

      @Override 
      protected void onPostExecute(Void result) 
      { 
        progressDialog.cancel(); 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 
       boolean isDataSubmitted = false; 

       while(!isDataSubmitted) 
       { 
        if(longitude !=0 && latitude!=0) 
        { 
         sendEmail(); 
         isDataSubmitted = true; 
        } 
       } 

       return null;  
      } 
} 


public void backHome(View view) 
{ 
    Intent intent = new Intent (this, MainScreen.class); 
    startActivity(intent); 
} 

// Method to start playing and looping a sound. 

public void playSound() 
{ 
    MediaPlayer clickSound = MediaPlayer.create(this, R.raw.warning); 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    Boolean soundCheck = sp.getBoolean("SOUND", false); 
    if (soundCheck) 
    { 
     clickSound.start(); 
    } 



}// method end 

public void sendEmail() 
{ 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    String nameValue = sp.getString("NAME", "failed to get name"); 
    String emailValue = sp.getString("EMAIL", "failed to get email"); 
    Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL, new String[]{emailValue}); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Email sent from DON'T PANIC - A Chris O'Brien Project"); 
    i.putExtra(Intent.EXTRA_TEXT, "Hi there\n" + nameValue + " is in mortal danger. They didn't include co-ords as they assume you know where they are..\nKind Regards\nDon't Panic! \n\n\n"); 

    try 
    { startActivity(Intent.createChooser(i, "Send mail....")); 
    } 
    catch (android.content.ActivityNotFoundException ex){ 

     Toast.makeText(ConfirmScreen.this, "There are no email clients installed or set up", Toast.LENGTH_SHORT).show(); 
    } 
} 


public void sendEmail(String a, String b, String c) 
{ 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    String nameValue = sp.getString("NAME", "failed to get name"); 
    String emailValue = sp.getString("EMAIL", "failed to get email"); 
    Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL, new String[]{emailValue}); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Email sent from DON'T PANIC - A Chris O'Brien Project"); 
    i.putExtra(Intent.EXTRA_TEXT, "Hi there\n" + nameValue + " is in mortal danger. Please see the co-ords attached and run to their rescue!" + 
      " If you don't see any co-ords, they didn't check the box and assume you know where they are.\nKind Regards\nDon't Panic! \n\n\n" + 
      a + b + c); 

    try 
    { startActivity(Intent.createChooser(i, "Send mail....")); 
    } 
    catch (android.content.ActivityNotFoundException ex){ 

     Toast.makeText(ConfirmScreen.this, "There are no email clients installed or set up", Toast.LENGTH_SHORT).show(); 
    } 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_confirm_screen, menu); 
    return true; 
} 






} 
Смежные вопросы