2016-03-24 22 views
0

當我嘗試啓動一個新活動(uploadLocation.class)時,我的應用程序不斷崩潰。 沒有錯誤突出顯示,我無法在uploadLocation類中進行調試。爲什麼我的android應用程序在開始一個新的活動時崩潰?

我已經添加權限,我的清單

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

MainActivity

由於從在MainActivity這部分代碼在執行應用程序崩潰。

public void uploadMyLocation (View view){ 
    startActivity(new Intent(this, uploadLocation.class)); 
} 

除了這個類的工作,因爲它應該(下完成MainActivity.java)

import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, LocationListener { 

Button uploadButton; 
TextView latitudeView, longitudeView, networkView; 
Location lastKnownLocation; 
private GoogleApiClient googleApiClient; 
private LocationRequest locationRequest; 
String latString1, lonString1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    uploadButton = (Button) findViewById(R.id.uploadButton); 
    networkView = (TextView) findViewById(R.id.networkView); 

    latitudeView = (TextView)findViewById(R.id.latitudeView); 
    longitudeView = (TextView)findViewById(R.id.longitudeView); 

    buildGoogleApiClient(); 

    ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()){ 
     networkView.setVisibility(View.INVISIBLE); 
    } else { 
     uploadButton.setEnabled(false); 
    } 


} 

public void uploadMyLocation (View view){ 
    startActivity(new Intent(this, uploadLocation.class)); 
} 

@Override 
public void onConnected(Bundle bundle) { 
    locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(100); // location updated every second 

    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this); 
    lastKnownLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 

    if(lastKnownLocation != null){ 
     latString1 = String.valueOf(lastKnownLocation.getLatitude()); 
     lonString1 = String.valueOf(lastKnownLocation.getLongitude()); 
    } 
    updateUI(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    latString1 = String.valueOf(location.getLatitude()); 
    lonString1 = String.valueOf(location.getLongitude()); 
    updateUI(); 
} 



@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    buildGoogleApiClient(); 
} 

synchronized void buildGoogleApiClient(){ 
    googleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build(); 
} 

@Override 
protected void onStart(){ 
    super.onStart(); 
    googleApiClient.connect(); 
} 

@Override 
protected void onDestroy(){ 
    super.onDestroy(); 
    googleApiClient.disconnect(); 
} 

void updateUI(){ 
    latitudeView.setText(latString1); 
    longitudeView.setText(lonString1); 
} 
} 

uploadLocation

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.ProtocolException; 
import java.net.URL; 
import java.net.URLEncoder; 

public class uploadLocation extends AppCompatActivity { 

TextView myLatitudeView, myLongitudeView, latitudeView, longitudeView; 
String latString, lonString; 

public void uploadInfo(View view){ 
    latString = latitudeView.getText().toString(); 
    lonString = longitudeView.getText().toString(); 
    myLatitudeView = (TextView)findViewById(R.id.myLatitudeView); 
    myLongitudeView = (TextView)findViewById(R.id.myLongitudeView); 
    myLatitudeView.setText(latString); 
    myLongitudeView.setText(lonString); 
    BackgroundOp backgroundOp = new BackgroundOp(); 
    backgroundOp.execute(latString, lonString); 
    finish(); 
} 

class BackgroundOp extends AsyncTask<String, Void, String>{ 

    String myUrl; 

    @Override 
    protected void onPreExecute() { 
     myUrl = "http://[web address]/[php script]"; 
    } 

    @Override 
    protected String doInBackground(String... data) { 
     String latString, lonString; 
     latString = data [0]; 
     lonString = data [1]; 

     try { 
      URL url = new URL(myUrl); 
      HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); 
      httpURLConnection.setRequestMethod("POST"); 
      httpURLConnection.setDoOutput(true); 
      OutputStream outputStream = httpURLConnection.getOutputStream(); 
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); 
      String myDataStream = URLEncoder.encode("Latitude", "UTF-8") + "=" + URLEncoder.encode(latString, "UTF-8") + "&" + 
        URLEncoder.encode("Longitude", "UTF-8") + "=" + URLEncoder.encode(lonString, "UTF-8"); 
      bufferedWriter.write(myDataStream); 
      bufferedWriter.flush(); 
      bufferedWriter.close(); 
      outputStream.close(); 
      InputStream inputStream = httpURLConnection.getInputStream(); 
      inputStream.close(); 
      httpURLConnection.disconnect(); 
      return "Upload Successful"; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (ProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
    } 
} 
} 

XML文件

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Upload Location" 
    android:id="@+id/uploadButton" 
    android:layout_marginBottom="61dp" 
    android:layout_above="@+id/networkView" 
    android:layout_centerHorizontal="true" 
    android:onClick="uploadInfo" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Get Data" 
    android:id="@+id/getDataButton" 
    android:onClick="uploadMyLocation" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="41dp" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="[Latitude]" 
    android:id="@+id/latitudeView" 
    android:layout_centerVertical="true" 
    android:layout_toStartOf="@+id/uploadButton" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="[Longitude]" 
    android:id="@+id/longitudeView" 
    android:layout_alignTop="@+id/latitudeView" 
    android:layout_toEndOf="@+id/uploadButton" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="[My Latitude]" 
    android:id="@+id/myLatitudeView" 
    android:layout_below="@+id/getDataButton" 
    android:layout_toStartOf="@+id/getDataButton" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="[My Longitude]" 
    android:id="@+id/myLongitudeView" 
    android:layout_below="@+id/getDataButton" 
    android:layout_toEndOf="@+id/getDataButton" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="[Network Unavailable]" 
    android:id="@+id/networkView" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="169dp" /> 

編譯器日誌:

03-24 16:11:26.893 17436-17436/? I/art: Late-enabling -Xcheck:jni 
03-24 16:11:27.044 17436-17467/com.cityuni.sophie.locationapp I/GMPM: App measurement is starting up 
03-24 16:11:27.058 17436-17467/com.cityuni.sophie.locationapp E/GMPM: getGoogleAppId failed with status: 10 
03-24 16:11:27.059 17436-17467/com.cityuni.sophie.locationapp E/GMPM: Uploading is not possible. App measurement disabled 
03-24 16:11:27.155 17436-17475/com.cityuni.sophie.locationapp D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
03-24 16:11:27.160 17436-17436/com.cityuni.sophie.locationapp D/Atlas: Validating map... 
03-24 16:11:27.208 17436-17475/com.cityuni.sophie.locationapp I/Adreno: QUALCOMM build     : 40d, I21dda 
                     Build Date      : 08/24/15 
                     OpenGL ES Shader Compiler Version: E031.25 
                     Local Branch      : 
                     Remote Branch     : quic/LA.4.1.1_r9 
                     Remote Branch     : NONE 
                     Reconstruct Branch    : NOTHING 
03-24 16:11:27.216 17436-17475/com.cityuni.sophie.locationapp I/OpenGLRenderer: Initialized EGL, version 1.4 
03-24 16:11:27.225 17436-17475/com.cityuni.sophie.locationapp D/OpenGLRenderer: Enabling debug mode 0 
03-24 16:11:27.388 17436-17436/com.cityuni.sophie.locationapp I/Timeline: Timeline: Activity_idle id: [email protected] time:407225888 
03-24 16:11:45.883 17436-17436/com.cityuni.sophie.locationapp D/AndroidRuntime: Shutting down VM 
03-24 16:11:45.902 17436-17436/com.cityuni.sophie.locationapp E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.cityuni.sophie.locationapp, PID: 17436 
                       java.lang.IllegalStateException: Could not find method uploadInfo(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'uploadButton' 
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:325) 
                        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284) 
                        at android.view.View.performClick(View.java:4861) 
                        at android.view.View$PerformClick.run(View.java:19980) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:211) 
                        at android.app.ActivityThread.main(ActivityThread.java:5373) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:372) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
03-24 16:12:19.041 17436-17436/com.cityuni.sophie.locationapp I/Process: Sending signal. PID: 17436 SIG: 9 
+1

發佈錯誤日誌... –

+0

您必須得到崩潰報告,請分享此內容。 –

+0

你可能有一個NULL的地方。我知道這聽起來像是一個簡單的解釋。但是很多時候,當你開始一個新的活動時,它依賴於通過的東西。如果有東西不在那裏,它會崩潰。在代碼編輯器中你不會看到任何關於它的信息。檢查你的日誌。 – durbnpoisn

回答

0

要可否告知您的每一次活動需要重寫onCreate()方法按照Doc

當活動開始時調用此方法。這是大多數的初始化應該去:致電setContentView(int)膨脹活動的UI,使用findViewById(int)以編程方式與在UI

我建議你重寫必要的方法,並且還不要忘了打電話super.onCreate()onCreate()部件相互作用方法。

UPDATE:

我想通了你的錯誤,那是因爲這個屬性

android:onClick="uploadInfo" 

因爲XML您提供的是activity_main.xml的。並且您正在另一個活動中創建方法uploadInfo。所以我建議你要麼刪除這個屬性,要麼創建uploadInfo方法MainActivity不在裏面uploadLocation活動。

要獲得提示,您可以按Alt鍵+該屬性輸入和創建方法uploadInfo由於Android工作室意味着你。

+0

現在就工作。謝謝 ! :) – Sophie

0

我想你還沒有將你的新活動添加到android清單文件。 嘗試添加。

<activity android:name=".uploadLocation"> 
</activity> 
+0

謝謝,我看到在編譯器日誌中添加它,重新運行它仍然崩潰 – Sophie

-1

當我開始我已經達到了同樣的問題在Android的發展,我用這個解決我的應用程序崩潰:

嘗試延伸活動,而不是延伸AppCompatActivity。

如果不工作也許你有一個組件null,檢查你instanciate在XML中聲明的所有組件。

+0

這裏的問題與Activity與AppCompatActivity無關。如果OP沒有使用基於AppCompat的主題,那隻會是一個問題。真正的問題在於,uploadInfo中沒有onCreate,並且它有一個非默認的構造函數。另外,指定onClick屬性的方式,不會找到要執行的方法。 – Matt

相關問題