我目前正与一位朋友合作开展一个项目,我们有一个网站托管登录详情等。当用户登录时,它会向应用程序返回一个令牌,用于验证用户进一步的api调用。 (即获取个人资料)。我需要将这个令牌传递给其他活动(它是一个字符串),我试图使用意图,但每次我尝试它都会出现一个nullPointerException
,其中我会调用意图从无法找到额外的i发送。我已经尝试将用于创建intent的代码放在onCreate
方法的顶部,但是这会从服务器返回401 errors
,因为(我假设)令牌没有值,因为它没有&# 39;已由服务器使用JSONObject请求发送。
这里是主要活动的代码(删除了所有链接)(我也没有包括所有的导入和变量声明,因为我认为他们没有必要)
String Name,Pass,tokenString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
token = (TextView) findViewById(R.id.TV1);
name = (EditText) findViewById(R.id.name);
pass = (EditText) findViewById(R.id.pass);
register = (Button) findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Name = name.getText().toString();
Pass = pass.getText().toString();
if(Name.equals("") || Pass.equals("")){
Toast.makeText(MainActivity.this, "Fields cannot be left empty!", Toast.LENGTH_SHORT).show();
}
StringRequest stringRequest = new StringRequest(Request.Method.POST, Url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
setToken(jsonObject.getString("token"));
launchHomeActivity();
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if(error.networkResponse.statusCode==401) {
Toast.makeText(MainActivity.this, "Incorrect login details, please retry", Toast.LENGTH_SHORT).show();
}
}
}){
protected Map<String,String> getParams() throws AuthFailureError{
Map<String,String> params = new HashMap<String, String>();
params.put("key", "****");
params.put("email", Name);
params.put("password", Pass);
return params;
}
};
MySingleton.getInstance(MainActivity.this).addToRequestQueue(stringRequest);
name.setText("");
pass.setText("");
}
});
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
launchRegisterActivity();
}
});
}
private void launchRegisterActivity() {
Intent intent = new Intent(this, RegisterActivity.class);
startActivity(intent);
}
private void launchHomeActivity() {
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
private void setToken(String token){
tokenString = token;
}
public String getToken(){
return tokenString;
}
public void createIntent(){
Intent i = new Intent(this, Home.class);
i.putExtra("Token", getToken());
startActivity(i);
}
}
这里是家庭活动的代码(相关位):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
token = (TextView) findViewById(R.id.TV1) ;
title = (TextView) findViewById(R.id.welcome_Txt);
Bundle extras = getIntent().getExtras();
final String tokenString = extras.getString("Token");
StringRequest stringRequest = new StringRequest(Request.Method.GET, ProfileUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
// JSONArray jsonArray = new JSONArray(response);
JSONObject jsonObject = new JSONObject(response);
title.setText("Welcome back " + jsonObject.getString("token") + "!");
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
protected Map<String,String> getParams() throws AuthFailureError{
Map<String,String> params = new HashMap<String, String>();
params.put("key", "****");
params.put("Token", tokenString);
return params;
}
};
MySingleton.getInstance(Home.this).addToRequestQueue(stringRequest);
}
非常感谢任何帮助 (p.s我对Android工作室来说很新,并且像我一样学习)
答案 0 :(得分:4)
从服务器获得响应后,您只调用launchHomeActivity方法。但是你在&#34; createIntent&#34;中设置数据;方法而已。我认为这是问题所在。我编辑了launchHomeActivity方法。
private void launchHomeActivity() {
Intent intent = new Intent(this, Home.class);
intent .putExtra("Token", getToken());
startActivity(intent);
}
答案 1 :(得分:1)
尝试这样做..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
token = (TextView) findViewById(R.id.TV1) ;
title = (TextView) findViewById(R.id.welcome_Txt);
String extras = getIntent().getStringExtra("Token);
但我会建议您更好地将该令牌保存在共享首选项中,并在您完成所有活动时使用。
例如:
用于设置首选项中的值:
SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME,
MODE_PRIVATE).edit();
editor.putString("Token", getToken);
editor.apply();
用于从首选项中检索数据:
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME,
MODE_PRIVATE);
String restoredText = prefs.getString("text", null);
if (restoredText != null) {
String name = prefs.getString("Token", "No name defined");//"No name
defined"
is the default value.
}
答案 2 :(得分:1)
您在launchHomeActivity()
和OnResponse()
收到回复后致电accessToken
。但是您将token
存储在createIntent()
上,而createIntent()
从未被调用过。在获得OnResponse()
后,请在token
方法上致电Activity
。
将令牌从Activity
传递到token
并非最佳做法。最好将SharedPrefrence
存储在SharedPreference
上并从任何地方访问它。创建一个单独的 public function register(Request $request) {
$this->validation($request);
User::create([
'name' => $request->name,
'lastname' => $request->lastname,
'email' => $request->email,
'password' => bcrypt($request->password)
]);
$user->attachRole($employer);
Auth::attempt([
'email' =>$request->email,
'password' => $request->password]);
// Authentication passed...
return redirect('/');
}
类,您可以在整个应用程序中使用它。
答案 3 :(得分:0)
调用活动时,您没有添加bundle(extras) 例如
Intent intent = new Intent(this, Home.class);
intent.putExtra("Token", "XXX-YYY-ZZZ"); //Imp
startActivity(intent);
答案 4 :(得分:0)
您使用两种不同的意图来调用相同的activity.class文件。 使用两个不同的使用仅使用1个意图,并仅将数据放入该Intent。 不需要两个不同的目的来呼叫家庭活动。
.ssh
答案 5 :(得分:0)
尝试这样。
Intent i = new Intent(this, Home.class);
i.putExtra("Token", getToken());
startActivity(i)
and on your Home activity get data like below code.
Intent intent=getIntent();
String token=intent.getStringExtra("token");