当我尝试对其进行测试时,我的应用程序将编译但无法在手机上启动,但它在控制台上出现很多错误,并且手机只是说它一直在停止。
这些是错误
[0.00652811, 0.00553418, 0.00605841]
这是mainactivity.java文件夹
W/t.myapplicatio: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
W/t.myapplicatio: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.SeniorProject.myapplication, PID: 2649
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.SeniorProject.myapplication/com.SeniorProject.myapplication.MainActivity}: java.util.UnknownFormatConversionException: Conversion = 'End of String'
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3086)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3229)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6981)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
Caused by: java.util.UnknownFormatConversionException: Conversion = 'End of String'
at java.util.Formatter$FormatSpecifierParser.peek(Formatter.java:2641)
at java.util.Formatter$FormatSpecifierParser.<init>(Formatter.java:2618)
at java.util.Formatter.parse(Formatter.java:2557)
at java.util.Formatter.format(Formatter.java:2504)
at com.SeniorProject.myapplication.MainActivity.updateSpeed(MainActivity.java:97)
at com.SeniorProject.myapplication.MainActivity.onCreate(MainActivity.java:44)
at android.app.Activity.performCreate(Activity.java:7326)
at android.app.Activity.performCreate(Activity.java:7317)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3066)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3229)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:6981)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)
Disconnected from the target VM, address: 'localhost:8602', transport: 'socket'
这是CLocation.java文件夹
package com.SeniorProject.myapplication;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.SwitchCompat;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Formatter;
import java.util.Locale;
public class MainActivity extends AppCompatActivity implements
LocationListener {
SwitchCompat Sw_metric;
TextView tv_speed;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Sw_metric = findViewById(R.id.sw_metric);
tv_speed = findViewById(R.id.tv_speed);
//check for gps permission
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[
{Manifest.permission.ACCESS_FINE_LOCATION}, 1000);
} else{
//start the program if the permission is granted
doStuff();
}
this.updateSpeed(null);
Sw_metric.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked){
MainActivity.this.updateSpeed(null);
}
});
}
@Override
public void onLocationChanged(Location location) {
if(location != null){
CLocation myLocation =new CLocation(location,
this.useMetricUnits());
this.updateSpeed(myLocation);
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@SuppressLint("MissingPermission")
private void doStuff(){
LocationManager locationManager = (LocationManager)
this.getSystemService(Context.LOCATION_SERVICE);
if(locationManager != null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
this);
}
Toast.makeText(this, "Waiting for GPS connection",
Toast.LENGTH_SHORT).show();
}
@SuppressWarnings("MalformedFormatString")
private void updateSpeed(CLocation location) {
float nCurrentSpeed = 0;
if (location != null) {
location.setUseMericUnits(this.useMetricUnits());
nCurrentSpeed = location.getSpeed();
}
Formatter fmt = new Formatter(new StringBuilder());
fmt.format(Locale.US, "%5.1", nCurrentSpeed);
String strCurrentSpeed = fmt.toString();
strCurrentSpeed = strCurrentSpeed.replace(" ", "0");
if (this.useMetricUnits()) {
tv_speed.setText(strCurrentSpeed + " km/h");
} else {
tv_speed.setText(strCurrentSpeed + " mp/h");
}
}
private boolean useMetricUnits() {
return Sw_metric.isChecked();
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull
String[] permissions,
@NonNull int[] grantResults) {
if(requestCode == 1000) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doStuff();
} else {
finish();
}
}
}
}
它不允许我发布那里的错误。就是说我需要添加一些细节,因为它主要是代码,所以我只是想使字数更多。
答案 0 :(得分:0)
我想您的问题的原因在以下行中:
fmt.format(Locale.US, "%5.1", nCurrentSpeed);
在格式字符串中,您指定了宽度和精度(5.1),但未指定格式操作的转换,因此出现错误:
Caused by: java.util.UnknownFormatConversionException: Conversion = 'End of String'
有关转换选项,请参见Java documentation for the Format class,然后选择一种适合您希望格式化值(nCurrentSpeed)的方式。