我想製作一個twitter客戶端,用戶可以在那裏使用自己的API密鑰,但應用程序崩潰。我如何允許用戶設置密鑰,以下是我所嘗試的。Android的twitter4j自定義API密鑰
如何在用戶未設置密鑰時捕獲異常?
package com.kerseykyle.customtweet;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import twitter4j.*;
import twitter4j.auth.AccessToken;
public class MainActivity extends Activity {
Context mContext;
Twitter mTwitter;
static int MAX_COUNT = 140;
Button btnTweet;
SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = getApplicationContext();
mTwitter = new TwitterFactory().getInstance();
EditText txtStatus = (EditText) findViewById(R.id.TweetData);
final TextView lblCount = (TextView) findViewById(R.id.count);
txtStatus.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// Display Remaining Character with respective color
int count = MAX_COUNT - s.length();
lblCount.setText(Integer.toString(count));
lblCount.setTextColor(Color.GREEN);
if (count < 10) {
lblCount.setTextColor(Color.YELLOW);
}
if (count < 0) {
lblCount.setTextColor(Color.RED);
}
if (count > 0) {
Button mSend = (Button) findViewById(R.id.postTweet);
mSend.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
EditText info = (EditText) findViewById(R.id.TweetData);
String mUpdateStatus = info.getText().toString();
try {
Status status = mTwitter
.updateStatus(mUpdateStatus);
Toast.makeText(getApplicationContext(),
"Updating status", Toast.LENGTH_LONG)
.show();
} catch (TwitterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}
//called when an option is clicked
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.item_prefs:
startActivity(new Intent(this, PrefsActivity.class));
break;
}
return true;
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
mTwitter.setOAuthConsumer(prefs.getString("consumer_key", ""), prefs.getString("consumer_secret", ""));
String token = prefs.getString("access_token", "");
String secret = prefs.getString("secret_access_token", "");
AccessToken at = new AccessToken(token, secret);
mTwitter.setOAuthAccessToken(at);
}
}
這裏是logcat的:
E/AndroidRuntime(14095): FATAL EXCEPTION: main
E/AndroidRuntime(14095): java.lang.NoClassDefFoundError: twitter4j.TwitterFactory
E/AndroidRuntime(14095): at com.kerseykyle.customtweet.MainActivity.onCreate(MainActivity.java:36)
E/AndroidRuntime(14095): at android.app.Activity.performCreate(Activity.java:4465)
E/AndroidRuntime(14095): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/AndroidRuntime(14095): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
E/AndroidRuntime(14095): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/AndroidRuntime(14095): at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime(14095): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/AndroidRuntime(14095): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(14095): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(14095): at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime(14095): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(14095): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(14095): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(14095): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(14095): at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager( 145): Force finishing activity com.kerseykyle.customtweet/.MainActivity
我將twitter4j jar添加到了我的項目中。 –