1

我正在尝试在onCreate MainActivity.java 中使用 LocationActivity.java 中的 checkGoogleplay(),但应用程序在运行时崩溃了。如果我合并两个 java 文件,它可以工作,所以它可能与导入问题有关?有人帮忙,谢谢

这是我的 LocationActivity

package com.example.location_calculator;

import android.app.Activity;

import android.location.Location;

import android.os.Bundle;

import android.util.Log;

import android.widget.TextView;

import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;

public class LocationActivity extends Activity implements LocationListener,GooglePlayServicesClient.ConnectionCallbacks,GooglePlayServicesClient.OnConnectionFailedListener
{

    private String TAG = this.getClass().getSimpleName();
    LocationRequest mLocationRequest;
    LocationClient mLocationClient;
    Location mCurrentLocation;
    TextView txtinstant;
    int resultCode;

    public void checkGoogleplay()
    {
        resultCode =GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());

        if(ConnectionResult.SUCCESS == resultCode){
            Log.d("Location Updates",
                    "Google Play services is available.");
            mLocationClient = new LocationClient(this, this, this);
            mLocationClient.connect();
        }
        else{
            Toast.makeText(this, "Google Play Service Error " + resultCode,Toast.LENGTH_LONG).show();
        }               

    }

这是我的 MainActivity

 package com.example.location_calculator;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity 
{

    TextView txtlocation;
    TextView txtstatus;
    TextView txtinstant;
    Button btn_loc;
    Button btn_ser;
    Button bnt_aploc;
    LocationActivity mlocal;


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


            mlocal =new LocationActivity();

            mlocal.checkGoogleplay();
}

这是目录

 08-23 15:19:12.576: W/dalvikvm(18236): threadid=1: thread exiting with uncaught exception (group=0x4190a700)
08-23 15:19:12.576: E/AndroidRuntime(18236): FATAL EXCEPTION: main
08-23 15:19:12.576: E/AndroidRuntime(18236): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.location_calculator/com.example.location_calculator.MainActivity}: java.lang.NullPointerException
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.os.Looper.loop(Looper.java:137)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.ActivityThread.main(ActivityThread.java:5103)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at java.lang.reflect.Method.invokeNative(Native Method)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at java.lang.reflect.Method.invoke(Method.java:525)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at dalvik.system.NativeStart.main(Native Method)
08-23 15:19:12.576: E/AndroidRuntime(18236): Caused by: java.lang.NullPointerException
08-23 15:19:12.576: E/AndroidRuntime(18236):    at com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(Unknown Source)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at com.example.location_calculator.LocationActivity.checkGoogleplay(LocationActivity.java:30)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at com.example.location_calculator.MainActivity.onCreate(MainActivity.java:35)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.Activity.performCreate(Activity.java:5133)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
08-23 15:19:12.576: E/AndroidRuntime(18236):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
08-23 15:19:12.576: E/AndroidRuntime(18236):    ... 11 more
4

8 回答 8

2

你正在这样做

   mlocal =new LocationActivity(); // which is wrong

活动开始于startActivity

如果您需要从 LoacationActivity 向 MainActivity 传递值,请使用意图(考虑到 LocationActivity 是一个活动类)。

你也有这个public class LocationActivity extends Activity

但我没有看到任何onCreate方法LocationActivity

还要检查这个

http://developer.android.com/training/location/retrieve-current.html

检查检查 Google Play 服务下的主题

于 2013-08-23T05:46:29.687 回答
1

您不能只使用以下方法创建活动对象:

我的活动活动 = 新的我的活动();

就像使用普通的 Java 类一样。Android 中的所有活动都必须经过活动生命周期,以便它们具有附加的有效上下文。

通过将 Activity 视为普通的 Java 类,您最终会得到一个空上下文。由于 Activity 中的大多数方法都是在其 Context 上调用的,因此您将收到空指针异常,这就是您的应用程序崩溃的原因。

相反,将需要从其他类调用的所有此类方法移动到实用程序类中,该类在其构造函数中接受有效上下文,然后在方法中使用该上下文来完成工作。

于 2013-08-23T05:46:54.460 回答
1

第一件事..我可以知道,您在 LocationActivity.java 活动中的 onCreate() 方法在哪里。

和 'mlocal =new LocationActivity();' 错了你需要启动那个activity,否则不要在LocationActivity文件中扩展Activity。

您是否在清单中声明了 LocationActivity?

LocationRequest 位置请求;LocationClient mLocationClient;

您可以探索以上两个课程吗,可能这些课程中的某些内容会变为空。

于 2013-08-23T06:04:44.133 回答
1

在位置 Activity 中添加 Oncreate 方法

在清单中添加添加位置活动

于 2013-08-23T06:08:27.247 回答
0

在您的 AndroidManifest.xml 文件中添加以下代码:

<activity
        android:name=".LocationActivity" />

在 MainActivity 下方...

于 2013-08-23T05:45:47.263 回答
0

只需将Context对象传递给GooglePlayServicesUtil

public void checkGoogleplay()
{
    resultCode =GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

    if(ConnectionResult.SUCCESS == resultCode){
        Log.d("Location Updates",
                "Google Play services is available.");
        mLocationClient = new LocationClient(this, this, this);
        mLocationClient.connect();
    }
    else{
        Toast.makeText(this, "Google Play Service Error " + resultCode,Toast.LENGTH_LONG).show();
    }               

方法在 Activity 中,并且 Activity 与 Simple Java 文件不同,因此,您需要启动它而不是为其创建对象:

Intent i= new Intent(this, LocationActivity.class);
startActivity(i);
于 2013-08-23T05:47:03.893 回答
0

更新你的方法

public void checkGoogleplay(Context mContext)
    {
        resultCode =GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext);

        if(ConnectionResult.SUCCESS == resultCode){
            Log.d("Location Updates",
                    "Google Play services is available.");
            mLocationClient = new LocationClient(mContext, this, this);
            mLocationClient.connect();
        }
        else{
            Toast.makeText(this, "Google Play Service Error " + resultCode,Toast.LENGTH_LONG).show();
        }               

    }
于 2013-08-23T07:06:07.590 回答
0

使 LocationActivity 成为一个普通的 Java 类,并在构造函数中将 MainActivity 上下文传递给该类。

仅在您可以显示视图的地方扩展 Activity。我认为不需要在 LocationActivity 中扩展 Activity

于 2013-08-23T07:06:40.247 回答