簡體   English   中英

我的 Java 速度計移動應用程序將編譯但無法啟動

[英]My Java speedometer mobile app will compile but not start

我的應用程序將編譯但無法在我的手機上啟動,當我嘗試測試它時,它在控制台上出現了很多錯誤,而手機只是說它一直在停止。

這些是錯誤

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'

這是 mainactivity.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();
        }
    }
}
}

這是 CLocation.java 文件夾

package com.SeniorProject.myapplication;

import android.location.Location;

public class CLocation extends Location {

    private boolean bUseMetricUnits = false;

    public CLocation(Location location){
        this(location, true);
    }

    public CLocation(Location location, boolean bUseMetricUnits) {
         super(location);
         this.bUseMetricUnits = bUseMetricUnits;
    }
    public boolean getUseMetricUnits() {
        return this.bUseMetricUnits;
    }

    public void setUseMericUnits(boolean bUseMetricUnits){
        this.bUseMetricUnits = bUseMetricUnits;
    }

    @Override
    public float distanceTo(Location dest) {
        float nDistance = super.distanceTo(dest);

        if(!this.getUseMetricUnits()) {
            // convert meters to feet
            nDistance = nDistance * 3.28083989501312f;
        }
        return nDistance;
    }

    @Override
    public double getAltitude() {
        double nAltitude = super.getAltitude();

        if(!this.getUseMetricUnits()) {
            // convert meters to feet
            nAltitude = nAltitude * 3.28083989501312d;
        }
        return nAltitude;
    }

    @Override
    public float getSpeed() {
        float nSpeed = super.getSpeed() * 3.6f;

        if(!this.getUseMetricUnits()) {
            // convert meters/second to miles/hour
            nSpeed = super.getSpeed() * 2.2363629f;
        }
        return nSpeed;
    }

    @Override
    public float getAccuracy() {
        float nAccuracy = super.getAccuracy();

        if(!this.getUseMetricUnits()) {
            // convert meters to feet
            nAccuracy = nAccuracy * 3.28083989501312f;
        }
        return nAccuracy;
    }
}

它不允許我發布那里的錯誤。 它說我需要添加更多細節,因為它主要是代碼,所以我只是想提高字數。

我猜你的問題的原因在以下幾行:

fmt.format(Locale.US, "%5.1", nCurrentSpeed);

在格式字符串中,您指定了寬度和精度 (5.1),但沒有指定格式操作的轉換,因此出現錯誤:

Caused by: java.util.UnknownFormatConversionException: Conversion = 'End of String'

有關轉換選項的 Format 類,請參閱Java 文檔,並選擇適合您希望如何格式化值 (nCurrentSpeed) 的選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM