Reputation: 6190
I am using Android API 23. I'm trying to request permissions from the user on runtime as is recommended for the new API. This is my implementation.
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);
}
}
On running the code on the phone, I get the following error in Android Studio.
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.view.ViewGroup.getContext()' on a null object reference
The full traceback is here:
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)
Line 271 of requestPermission
is:
Snackbar.make(view,requestText,Snackbar.LENGTH_INDEFINITE).setAction("Ok",...);
My onCreate
looks like this:
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);
My 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>
Where am I going wrong and how do I fix this?
Upvotes: 0
Views: 3267
Reputation: 44118
findViewById()
call should be connected with the activity lifecycle.
It should be called after you've called setContentView
.
Upvotes: 2
Reputation: 13485
in your onCreate() method, just add
view = (View) findViewById(R.id.form);
before you call the check permission.
Upvotes: 1