NullPointerException Android getContext()

时间:2016-04-27 15:24:49

标签: android

我正在使用Android API 23.我正在尝试在运行时向用户请求权限,这是新API推荐的。这是我的实施。

private void requestPermission(String type){
    String permission = "";
    String requestText = "";
    if(type.equals("video")){
        permission = Manifest.permission.CAMERA;
        requestText = "Need Camera Permission";
    }else if(type.equals("picture")){
        permission = Manifest.permission.CAMERA;
        requestText = "Need Camera Permission";
    }else if(type.equals("audio")){
        permission = Manifest.permission.RECORD_AUDIO;
        requestText = "Need Audio Permission";
    }

    if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
        Snackbar.make(view, requestText, Snackbar.LENGTH_INDEFINITE).setAction("Ok",
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);
                    }
                });
    }else {
        Snackbar.make(view, "Permission is not available. Requesting camera permission.", Snackbar.LENGTH_SHORT).show();
        ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);
    }
}

在手机上运行代码时,我在Android Studio中收到以下错误消息。

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.view.ViewGroup.getContext()' on a null object reference

完整的追溯在这里:

FATAL EXCEPTION: main
Process: com.xxxxx.gcmtest, PID: 4779
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.view.ViewGroup.getContext()' on a null object reference
at android.support.design.widget.Snackbar.<init>(Snackbar.java:183)
at android.support.design.widget.Snackbar.make(Snackbar.java:215)
at com.xxxxx.gcmtest.ConversationActivity.requestPermission(ConversationActivity.java:271)
at com.xxxxx.gcmtest.ConversationActivity.onClick(ConversationActivity.java:185)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

requestPermission的第271行是:

Snackbar.make(view,requestText,Snackbar.LENGTH_INDEFINITE).setAction("Ok",...);

我的onCreate看起来像这样:

private ChatAdapter chatAdapter;
private ListView listView;
private Button buttonSendAudio;
private Button buttonSendVideo;
private Button buttonSendPicture;
private boolean side = false;
private String fileType;
private Context context;
private static final int PERMISSION_REQUEST_CODE = 1;
private View view;
private Activity activity;
view = findViewById(R.id.chat_layout);

我的fragment.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/chat_layout">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal" />
    <ListView
        android:id="@+id/list_conversations"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="80dp">
    </ListView>

    <RelativeLayout
        android:id="@+id/form"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:orientation="vertical" >

    </RelativeLayout>
</RelativeLayout>

我哪里出错了,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

findViewById()调用应与活动生命周期相关联。

应该在您调用setContentView之后调用它。

答案 1 :(得分:1)

在你的onCreate()方法中,只需添加

view = (View) findViewById(R.id.form); 

在致电检查权限之前。