Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用异步任务获取GPS位置?_Android_Android Asynctask - Fatal编程技术网

Android 如何使用异步任务获取GPS位置?

Android 如何使用异步任务获取GPS位置?,android,android-asynctask,Android,Android Asynctask,对于这类问题,我已经看到了很多答案,但与我的任务无关。我试图在后台获取gps位置,但遇到异常,因为无法在mlocManager.requestLocationUpdates LocationManager.gps_PROVIDER,0,mlocListener;中未在Android中调用Looper Prepare的线程内创建处理程序 我不知道为什么我们不能在doBackground方法中调用它 谢谢你们的帮助。你们不能这么做。mlocListener需要一个活套线程来运行 在doInBackg

对于这类问题,我已经看到了很多答案,但与我的任务无关。我试图在后台获取gps位置,但遇到异常,因为无法在mlocManager.requestLocationUpdates LocationManager.gps_PROVIDER,0,mlocListener;中未在Android中调用Looper Prepare的线程内创建处理程序

我不知道为什么我们不能在doBackground方法中调用它


谢谢你们的帮助。

你们不能这么做。mlocListener需要一个活套线程来运行

在doInBackground中调用Looper.prepare

所以你的代码会变成这样

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

您不能这样做。mlocListener需要一个循环器线程来操作

在doInBackground中调用Looper.prepare

所以你的代码会变成这样

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

最后我解决了这个问题,我想这会帮助像我这样的人

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在OnPreecute中执行异常,可以从我的应用程序中清除异常。我们可以让gps在预先执行而不是在后台执行。

最后我解决了问题,我想这会帮助像我这样的人

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在OnPreecute中执行异常,可以从我的应用程序中清除异常。我们可以让gps在预先执行而不是在后台执行。

这似乎适合我目前正在尝试的操作。你能给我看一下完整的资料来源吗?我目前已经将其应用到我的代码中,但我想看看您是如何获得GPS命令并启动异步的

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;
}






}

这似乎适合我目前正在做的事情。你能给我看一下完整的资料来源吗?我目前已经将其应用到我的代码中,但我想看看您是如何获得GPS命令并启动异步的

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;
}






}

谢谢你的回答事实上我解决了那个问题。。现在它是另一个SmsManager smsmsmanager=smsmsmanager.getDefault;smsManager.sendTextMessagesms_电话号码,null,message,sentPI,null;它表示空指针异常。。你知道这件事吗。。。谢谢你应该用你的最新错误创建一个新问题,因为很难解决我们看不见的问题。谢谢你的回答实际上我解决了那个问题。。现在它是另一个SmsManager smsmsmanager=smsmsmanager.getDefault;smsManager.sendTextMessagesms_电话号码,null,message,sentPI,null;它表示空指针异常。。你知道这件事吗。。。谢谢你应该用你的最新错误创建一个新问题,因为很难解决我们看不到的问题。