0

我一直在尝试为 Android 编写一个 twitter 客户端(使用 twitter4j)。到目前为止的想法是有一个简单的 GUI,如果 SD 卡中没有带有 OAuth 令牌的文件,则使用 AsyncTask 连接到 Twitter API,获取授权 URL 并打开默认浏览器。但是,浏览器永远不会运行。根据我尝试修复此问题所做的不同修改,Activity 正常启动但浏览器永远不会启动或 Activity 崩溃。我已经到了有点沮丧和困惑的地步。有人可以指出我的代码有什么问题吗?

public class StatusActivity extends Activity {

private static final String TAG = "StatusActivity";
EditText editText;
Button updateButton;
File oauthfile = null;
public Context context = getApplicationContext();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_status);

    Log.d(TAG, "started");
    // Find views
    editText = (EditText) findViewById(R.id.editText); //
    updateButton = (Button) findViewById(R.id.buttonUpdate);

    oauthfile = new File("sdcard/auth_file.txt");

    //Check if the file with the keys exist
    if (oauthfile.exists()==false){
        Log.d(TAG, "file not created");
        Context context = getApplicationContext();
        Toast toast = Toast.makeText(context, "file not created.",    Toast.LENGTH_SHORT);
        toast.show();
        new Authorization(context).execute();

    }


}

public void openBrowser (View v){
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
    startActivity(browserIntent);
    Log.d(TAG, "onclick");
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.status, menu);
    return true;
    }
}

class Authorization extends AsyncTask <String, Integer, String>{
String url = null;
private Context context;

 Authorization(Context context) {
        this.context = context.getApplicationContext();
    }



public void onPreExecute() {
       super.onPreExecute();
       Toast.makeText(context, "Invoke onPreExecute()", Toast.LENGTH_SHORT).show();         
      }


@Override
public String doInBackground(String... params) {
    ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    configBuilder.setDebugEnabled(true)
//I have eliminated the keys from the question :)
    .setOAuthConsumerKey("XXXXXXXXXXXXXX")
    .setOAuthConsumerSecret("XXXXXXXXXXXXXXX");
    Twitter OAuthTwitter = new TwitterFactory(configBuilder.build()).getInstance();
    RequestToken requestToken = null;
    AccessToken accessToken = null;     
    do{
        try {
            requestToken = OAuthTwitter.getOAuthRequestToken();
            url = requestToken.getAuthorizationURL();
        } 
        catch (TwitterException ex) {
            ex.printStackTrace();
        }       
    }
    while (accessToken==null);
    return url;
}

protected void onPostExecute(String result) {
    super.onPostExecute(result);

    Toast.makeText(context, "Opening browser.", Toast.LENGTH_SHORT).show();

    Intent browserIntent = new Intent(Intent.ACTION_ALL_APPS, Uri.parse(url));
    context.startActivity(browserIntent);
}
}

我知道至少检查令牌文件是否存在,因为出现“未创建文件”的 toast,并且如果我按下按钮,活动能够运行浏览器。该应用程序有权写入 SD 卡并使用互联网。提前致谢。

Logcat 跟踪:

03-28 19:02:32.816: E/AndroidRuntime(278): FATAL EXCEPTION: main
03-28 19:02:32.816: E/AndroidRuntime(278): java.lang.RuntimeException: Unable to     instantiate activity     ComponentInfo{com.versec.pardinus/com.versec.pardinus.StatusActivity}: java.lang.NullPointerException
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.os.Looper.loop(Looper.java:123)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.reflect.Method.invokeNative(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.reflect.Method.invoke(Method.java:521)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 19:02:32.816: E/AndroidRuntime(278):  at dalvik.system.NativeStart.main(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278): Caused by: java.lang.NullPointerException
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:100)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.versec.pardinus.StatusActivity.<init>(StatusActivity.java:30)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.Class.newInstanceImpl(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.Class.newInstance(Class.java:1429)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
03-28 19:02:32.816: E/AndroidRuntime(278):  ... 11 more
4

1 回答 1

1

这就是导致您崩溃的原因。

public Context context = getApplicationContext();

您甚至在需要时都不会使用它,因此您可以摆脱这条线。

顺便说一句,我在查看您的代码时注意到的另一件事是:

oauthfile = new File("sdcard/auth_file.txt");

不要认为“sdcard/”路径是理所当然的。改用这个:

    File dir = Environment.getExternalStorageDirectory();
    File oauthfile = new File(dir, "auth_file.txt");
于 2013-03-28T19:13:12.110 回答