В настоящее время я пытаюсь отправить свое текущее местоположение на номер, когда таймер обратного отсчета, который реализован, завершается. Я смог успешно отправлять сообщения на другой номер, только когда я пытаюсь отправить местоположение, в котором происходит сбой моего приложения. Вот моя активность, в которой сообщение должно быть отправлено
public class alert extends AppCompatActivity{
public int counter;
Button stopTimer;
TextView counttime;
CountDownTimer countDownTimer;
MediaPlayer player;
Home home;
public static String uri;
private FusedLocationProviderClient fusedLocationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_alert);
stopTimer = (Button) findViewById(R.id.stop);
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
fusedLocationClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
// Got last known location. In some rare situations this can be null.
if (location != null) {
uri = "http://maps.google.com/maps?saddr=" + location.getLatitude()+","+location.getLongitude();
}
}
});
player = MediaPlayer.create(this, R.raw.alram);
home = new Home();
counttime=findViewById(R.id.text1);
//countDownTimer.start();
countDownTimer = new CountDownTimer(10000,1000) {
@Override
public void onTick(long millisUntilFinished) {
counttime.setText("seconds remaining: " + millisUntilFinished / 1000);
player.start();
}
@Override
public void onFinish() {
Toast.makeText(alert.this," Message sent", Toast.LENGTH_SHORT).show();
player.stop();
FragmentManager fm = getSupportFragmentManager();
Home home = new Home();
fm.beginTransaction().replace(R.id.alert, home).commit();
String phonenumber = home.number;
SmsManager smsManager = SmsManager.getDefault();
StringBuffer smsBody = new StringBuffer();
smsBody.append(Uri.parse(uri));
smsManager.sendTextMessage(phonenumber, null, smsBody.toString(), null, null);
}
}.start();
stopTimer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
countDownTimer.cancel();
player.stop();
FragmentManager fm = getSupportFragmentManager();
Home home = new Home();
fm.beginTransaction().replace(R.id.alert, home).commit();
Toast.makeText(alert.this,"Cancelled", Toast.LENGTH_SHORT).show();
}
});
}
}
Это также разрешения, которые я добавил к своему манифесту
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.INTERNET" />
Это моя полная трассировка стека:
2020-04-15 15:17:38.707 19740-19740/com.example.carcrashdetection E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.carcrashdetection, PID: 19740
java.lang.NullPointerException: uriString
at android.net.Uri$StringUri.<init>(Uri.java:496)
at android.net.Uri$StringUri.<init>(Uri.java:486)
at android.net.Uri.parse(Uri.java:458)
at com.example.carcrashdetection.alert$2.onFinish(alert.java:76)
at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Номер, который я получаю из другого класса, но он работает, если я не отправляю местоположение, поэтому я знаю, что это не проблема. Я думаю, что URI может быть нулевым, но я не знаю, почему это будет. Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.