пытался выяснить, почему мой код не работает в новом эмуляторе 4.0 уже несколько дней и, похоже, не может до конца разобраться, мой код, который прекрасно работает в 2.2 sdk, вообще не работает в 4.0 SDK эмулятор, в результате этого я пытался отследить некоторые учебники по отладке, но, похоже, не могу получить четкое объяснение того, какой из них лучше или, откровенно говоря, ясный способ выполнения функций, так Вопрос в том, что лучше, и как лучше это сделать?
Обновление:
Исключения:
11-23 10:16:34.655: E/AndroidRuntime(1358): java.lang.RuntimeException:
Unable to resume activity {com.testapp2.second/com.testapp2.second.activities.AuthorizationActivity}: android.os.NetworkOnMainThreadException
11-23 10:16:34.655: E/AndroidRuntime(1358): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2443)
вот мой код:
activity1:
package com.testapp2.second.activities;
import com.testapp2.second.OTweetApplication;
import com.testapp2.second.R;
import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
public class Testapp2Activity extends ListActivity {
private Twitter twitter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (OTweetApplication)getApplication();
twitter = app.getTwitter();
setContentView(R.layout.main);
}
@Override
protected void onResume() {
super.onResume();
if (!app.isAuthorized()) {
beginAuthorization();
} else {
loadTimelineIfNotLoaded();
}
}
private void loadTimelineIfNotLoaded() {
loadHomeTimeline();
}
private void beginAuthorization() {
Intent intent = new Intent(this, AuthorizationActivity.class);
startActivity(intent);
}
private void loadHomeTimeline() {
try {
ResponseList<Status> statii = twitter.getHomeTimeline();
StatusListAdapter adapter = new StatusListAdapter(this, statii);
setListAdapter(adapter);
} catch (TwitterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class StatusListAdapter extends ArrayAdapter<Status> {
public StatusListAdapter(Context context, ResponseList<Status> statii) {
super(context, android.R.layout.simple_list_item_1, statii);
}
}
}
мероприятие 2:
package com.testapp2.second.activities;
import com.testapp2.second.OTweetApplication;
import com.testapp2.second.R;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class AuthorizationActivity extends Activity {
private OTweetApplication app;
private WebView webView;
private WebViewClient webViewClient = new WebViewClient() {
@Override
public void onLoadResource(WebView view, String url) {
// the URL we're looking for looks like this:
// http://otweet.com/authenticated?oauth_token=1234567890qwertyuiop
Uri uri = Uri.parse(url);
if (uri.getHost().equals("otweet.com")) {
String token = uri.getQueryParameter("oauth_token");
if (null != token) {
webView.setVisibility(View.INVISIBLE);
app.authorized();
finish();
} else {
// tell user to try again
}
} else {
super.onLoadResource(view, url);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
app = (OTweetApplication)getApplication();
setContentView(R.layout.authorization_view);
setUpViews();
}
@Override
protected void onResume() {
super.onResume();
String authURL = app.beginAuthorization();
webView.loadUrl(authURL);
}
private void setUpViews() {
webView = (WebView)findViewById(R.id.web_view);
webView.setWebViewClient(webViewClient);
}
}
расширенное применение:
package com.testapp2.second;
import com.testapp2.second.authorization.OAuthHelper;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.app.Application;
public class OTweetApplication extends Application {
private Twitter twitter;
private RequestToken currentRequestToken;
private OAuthHelper oAuthHelper;
@Override
public void onCreate() {
super.onCreate();
oAuthHelper = new OAuthHelper(this);
twitter = new TwitterFactory().getInstance();
oAuthHelper.configureOAuth(twitter);
}
public Twitter getTwitter() {
return twitter;
}
public boolean isAuthorized() {
return oAuthHelper.hasAccessToken();
}
public String beginAuthorization() {
try {
if (null == currentRequestToken) {
currentRequestToken = twitter.getOAuthRequestToken();
}
return currentRequestToken.getAuthorizationURL();
} catch (TwitterException e) {
e.printStackTrace();
}
return null;
}
public boolean authorize(String pin) {
try {
AccessToken accessToken = twitter.getOAuthAccessToken(currentRequestToken, pin);
oAuthHelper.storeAccessToken(accessToken);
return true;
} catch (TwitterException e) {
throw new RuntimeException("Unable to authorize user", e);
}
}
public void authorized() {
try {
AccessToken accessToken = twitter.getOAuthAccessToken();
oAuthHelper.storeAccessToken(accessToken);
} catch (TwitterException e) {
throw new RuntimeException("Unable to authorize user", e);
}
}
}
oauth helper:
package com.testapp2.second.authorization;
import java.io.InputStream;
import java.util.Properties;
import com.testapp2.second.R;
import twitter4j.Twitter;
import twitter4j.auth.AccessToken;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class OAuthHelper {
private static final String APPLICATION_PREFERENCES = "app_prefs";
private static final String AUTH_KEY = "auth_key";
private static final String AUTH_SEKRET_KEY = "auth_secret_key";
private SharedPreferences prefs;
private AccessToken accessToken;
private String consumerSecretKey;
private String consumerKey;
private Context context;
public OAuthHelper(Context context) {
this.context = context;
prefs = context.getSharedPreferences(APPLICATION_PREFERENCES, Context.MODE_PRIVATE);
loadConsumerKeys();
accessToken = loadAccessToken();
}
public void configureOAuth(Twitter twitter) {
twitter.setOAuthConsumer(consumerKey, consumerSecretKey);
twitter.setOAuthAccessToken(accessToken);
}
public boolean hasAccessToken() {
return null != accessToken;
}
public void storeAccessToken(AccessToken accessToken) {
Editor editor = prefs.edit();
editor.putString(AUTH_KEY, accessToken.getToken());
editor.putString(AUTH_SEKRET_KEY, accessToken.getTokenSecret());
editor.commit();
this.accessToken = accessToken;
}
private AccessToken loadAccessToken() {
String token = prefs.getString(AUTH_KEY, null);
String tokenSecret = prefs.getString(AUTH_SEKRET_KEY, null);
if (null != token && null != tokenSecret) {
return new AccessToken(token, tokenSecret);
} else {
return null;
}
}
private void loadConsumerKeys() {
try {
Properties props = new Properties();
InputStream stream = context.getResources().openRawResource(R.raw.oauth);
props.load(stream);
consumerKey = (String)props.get("consumer_key");
consumerSecretKey = (String)props.get("consumer_secret_key");
} catch (Exception e) {
throw new RuntimeException("Unable to load consumer keys from oauth.properties", e);
}
}
}
манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testapp2.second"
android:versionCode="1"
android:versionName="1.0" >
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light"
android:name=".OTweetApplication" >
<activity
android:label="@string/app_name"
android:name=".activities.Testapp2Activity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activities.AuthorizationActivity" android:label="@string/authorization" />
</application>
<uses-sdk android:minSdkVersion="14" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>