首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SharedPreferences中存储访问令牌将返回空对象引用错误。

在SharedPreferences中存储访问令牌将返回空对象引用错误。
EN

Stack Overflow用户
提问于 2020-08-25 15:23:19
回答 1查看 228关注 0票数 0

登录后,我试图存储从我的oAuth2服务器收到的访问令牌,但是当我试图存储它时,我会得到一个错误的java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.dentdevils.helper.retrofit.oauth2.PreferenceClass.setToken(java.lang.String)' on a null object reference,我不知道为什么。

以下是我的课程:PreferenceClass.java

代码语言:javascript
运行
复制
package com.example.dentdevils.helper.retrofit.oauth2;

import android.content.Context;
import android.content.SharedPreferences;

public class PreferenceClass {

    public static final String PREFERENCE = "accessTokenPref";
    private SharedPreferences sharedPreferences;

    public PreferenceClass(Context context) {
        sharedPreferences = context.getSharedPreferences(PREFERENCE, Context.MODE_PRIVATE);
    }

    public String getToken() {
        String token = sharedPreferences.getString("token", "");
        return token;
    }

    public void setToken(String token) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("token", token);
        editor.commit();
    }

    public void clearToken() {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove("token");
        editor.commit();
    }

}

MainActivity.Java

代码语言:javascript
运行
复制
package com.example.dentdevils;

import android.Manifest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.dentdevils.helper.retrofit.oauth2.PreferenceClass;
import com.example.dentdevils.helper.retrofit.oauth2.client.cOauthService;
import com.example.dentdevils.helper.retrofit.oauth2.request.AccessToken;
import com.example.dentdevils.helper.retrofit.oauth2.response.AccessTokenResponse;
import com.example.dentdevils.helper.retrofit.oauth2.service.OauthService;
import com.example.dentdevils.ui.HomeActivity;

import retrofit2.Call;
import retrofit2.Callback;

public class MainActivity extends AppCompatActivity {

    SharedPreferences sharedPreferences;
    public static final String mypreference = "mypref";
    public static final String email = "emailKey";
    public static final String access = "accessKey";

    public static final int MY_PERMISSIONS_REQUEST_CAMERA = 99;

    private static final String TAG = MainActivity.class.getSimpleName();

    private Button btnLogin;
    private EditText inputEmail;
    private EditText inputPassword;
    private ProgressDialog progressDialog;

    private PreferenceClass preferenceClass;




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

        checkCameraPermission();

        sharedPreferences = getSharedPreferences(mypreference,
                Context.MODE_PRIVATE);

        inputEmail = findViewById(R.id.email);
        inputPassword = findViewById(R.id.txtEditPassword);
        btnLogin = findViewById(R.id.btnLogin);

        progressDialog = new ProgressDialog(this);
        progressDialog.setCancelable(false);

        btnLogin.setOnClickListener(v -> getAccessToken());
    }

    public void getAccessToken() {
        progressDialog.show();
        AccessToken accessToken = new AccessToken();
        accessToken.setClient_id("client");
        accessToken.setClient_secret("client");
        accessToken.setGrant_type("client_credentials");

        OauthService oauthService = cOauthService.createService(OauthService.class, inputEmail.getText().toString(), inputPassword.getText().toString());
        Call<AccessTokenResponse> call = oauthService.fetchAccessToken(accessToken);
        call.enqueue(new Callback<AccessTokenResponse>() {
            @Override
            public void onResponse(Call<AccessTokenResponse> call, retrofit2.Response<AccessTokenResponse> response) {
                if (response.isSuccessful()) {
                    String a = response.body().getAccess_token();
                    preferenceClass.setToken(a);
                    progressDialog.dismiss();
                    Intent i = new Intent(getApplicationContext(), HomeActivity.class);
                    startActivity(i);
                } else {
                    progressDialog.dismiss();
                    Toast.makeText(MainActivity.this, "There was an error, please try again!", Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<AccessTokenResponse> call, Throwable t) {
                Log.d("Error", t.getMessage());
            }
        });

    }

    public boolean checkCameraPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
                new AlertDialog.Builder(this)
                        .setTitle("Permission Required!")
                        .setMessage("This app requires the camera permission to be able to capture images of car damage. Please grant the app access to the camera by going into your Settings > Apps > Apps > Dent Devils > Permissions > Camera, then press Allow.")
                        .setPositiveButton("", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
                            }
                        })
                        .create()
                        .show();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);
            }
            return false;
        } else {
            return true;
        }
    }

}

对于为什么这样做不起作用,并且不将我的访问令牌存储在SharedPreferences中,有什么显而易见的吗?我知道访问令牌会被返回,因为我可以将它记录下来,然后它就会出现。

完整的logcat输出如下所示:

代码语言:javascript
运行
复制
2020-08-25 16:22:20.724 7197-7197/com.example.dentdevils E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.dentdevils, PID: 7197
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.dentdevils.helper.retrofit.oauth2.PreferenceClass.setToken(java.lang.String)' on a null object reference
        at com.example.dentdevils.MainActivity$1.onResponse(MainActivity.java:76)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89)
        at retrofit2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$3wC8FyV4pyjrzrYL5U0mlYiviZw.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:888)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8178)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-25 15:28:28

您从未在preferenceClass中指定MainActivity值。

将类似的内容添加到onCreate

代码语言:javascript
运行
复制
preferenceClass = new PreferenceClass(this);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63582104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档