Android OAuth2.0适用于2.2,但不适用于4.1
我现在对oAuth有点意见。这是我一直在处理的一个示例代码,它在2.2上运行得非常完美,但当我在4.1上测试它时,我会遇到强制关闭错误 下面是我一直在处理的示例代码:Android OAuth2.0适用于2.2,但不适用于4.1,android,oauth-2.0,Android,Oauth 2.0,我现在对oAuth有点意见。这是我一直在处理的一个示例代码,它在2.2上运行得非常完美,但当我在4.1上测试它时,我会遇到强制关闭错误 下面是我一直在处理的示例代码: public class OAuthAccessTokenActivity extends Activity { final String TAG = getClass().getName(); private SharedPreferences prefs; @Override public void onCreate
public class OAuthAccessTokenActivity extends Activity {
final String TAG = getClass().getName();
private SharedPreferences prefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "Starting task to retrieve request token.");
this.prefs = PreferenceManager.getDefaultSharedPreferences(this);
// new OAuthRequestTokenTask(this).execute();
}
@Override
protected void onResume() {
super.onResume();
WebView webview = new WebView(this);
webview.getSettings().setJavaScriptEnabled(true);
webview.setVisibility(View.VISIBLE);
setContentView(webview);
String authorizationUrl = new GoogleAuthorizationRequestUrl(
OAuth2ClientCredentials.CLIENT_ID,
OAuth2ClientCredentials.REDIRECT_URI,
OAuth2ClientCredentials.SCOPE).build();
/* WebViewClient must be set BEFORE calling loadUrl! */
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap bitmap) {
System.out.println("onPageStarted : " + url);
}
@Override
public void onPageFinished(WebView view, String url) {
if (url.startsWith(OAuth2ClientCredentials.REDIRECT_URI)) {
try {
if (url.indexOf("code=") != -1) {
String code = extractCodeFromUrl(url);
AccessTokenResponse accessTokenResponse = new GoogleAuthorizationCodeGrant(
new NetHttpTransport(),
new JacksonFactory(),
OAuth2ClientCredentials.CLIENT_ID,
OAuth2ClientCredentials.CLIENT_SECRET,
code, OAuth2ClientCredentials.REDIRECT_URI)
.execute();
CredentialStore credentialStore = new SharedPreferencesCredentialStore(prefs);
credentialStore.write(accessTokenResponse);
view.setVisibility(View.INVISIBLE);
startActivity(new Intent(OAuthAccessTokenActivity.this,AgentPortalActivity.class));
} else if (url.indexOf("error=") != -1) {
view.setVisibility(View.INVISIBLE);
new SharedPreferencesCredentialStore(prefs).clearCredentials();
startActivity(new Intent(OAuthAccessTokenActivity.this,LatitudeApiSample.class));
}
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("onPageFinished : " + url);
}
private String extractCodeFromUrl(String url) {
return url.substring(
OAuth2ClientCredentials.REDIRECT_URI.length() + 7,
url.length());
}
});
webview.loadUrl(authorizationUrl);
}
}
这是我的日志:
04-04 13:04:50.407: E/AndroidRuntime(20119): FATAL EXCEPTION: main
04-04 13:04:50.407: E/AndroidRuntime(20119): android.os.NetworkOnMainThreadException
04-04 13:04:50.407: E/AndroidRuntime(20119): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
04-04 13:04:50.407: E/AndroidRuntime(20119): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-04 13:04:50.407: E/AndroidRuntime(20119): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
04-04 13:04:50.407: E/AndroidRuntime(20119): at java.net.InetAddress.getAllByName(InetAddress.java:214)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnecti(HttpsURLConnectionImpl.java:461)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
04-04 13:04:50.407: E/AndroidRuntime(20119): at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:281)
04-04 13:04:50.407: E/AndroidRuntime(20119): at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:78)
04-04 13:04:50.407: E/AndroidRuntime(20119): at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:361)
04-04 13:04:50.407: E/AndroidRuntime(20119): at com.google.api.client.auth.oauth2.draft10.AccessTokenRequest.executeUnparsed(AccessTokenRequest.java:457)
04-04 13:04:50.407: E/AndroidRuntime(20119): at com.google.api.client.auth.oauth2.draft10.AccessTokenRequest.execute(AccessTokenRequest.java:473)
04-04 13:04:50.407: E/AndroidRuntime(20119): at com.jetdelivery.mobile.OAuthAccessTokenActivity$1.onPageFinished(OAuthAccessTokenActivity.java:95)
04-04 13:04:50.407: E/AndroidRuntime(20119): at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:389)
04-04 13:04:50.407: E/AndroidRuntime(20119): at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 13:04:50.407: E/AndroidRuntime(20119): at android.os.Looper.loop(Looper.java:137)
04-04 13:04:50.407: E/AndroidRuntime(20119): at android.app.ActivityThread.main(ActivityThread.java:4918)
04-04 13:04:50.407: E/AndroidRuntime(20119): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 13:04:50.407: E/AndroidRuntime(20119): at java.lang.reflect.Method.invoke(Method.java:511)
04-04 13:04:50.407: E/AndroidRuntime(20119): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
04-04 13:04:50.407: E/AndroidRuntime(20119): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
04-04 13:04:50.407: E/AndroidRuntime(20119): at dalvik.system.NativeStart.main(Native Method)
04-04 13:04:50.407:E/AndroidRuntime(20119):致命异常:主
04-04 13:04:50.407:E/AndroidRuntime(20119):android.os.NetworkOnMainThreadException
04-04 13:04:50.407:E/AndroidRuntime(20119):在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于java.net.InetAddress.lookupHostByName(InetAddress.java:385)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于java.net.InetAddress.getAllByName(InetAddress.java:214)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpConnection.(HttpConnection.java:70)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpConnection.(HttpConnection.java:50)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)上
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnecti(HttpsURLConnectionImpl.java:461)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
04-04 13:04:50.407:E/AndroidRuntime(20119):在libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:281)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:78)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于com.google.api.client.http.HttpRequest.execute(HttpRequest.java:361)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于com.google.api.client.auth.oauth2.draft10.AccessTokenRequest.executeUnparsed(AccessTokenRequest.java:457)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于com.google.api.client.auth.oauth2.draft10.AccessTokenRequest.execute(AccessTokenRequest.java:473)
04-04 13:04:50.407:E/AndroidRuntime(20119):在com.jetdelivery.mobile.OAuthAccessTokenActivity$1.onPageFinished(OAuthAccessTokenActivity.java:95)
04-04 13:04:50.407:E/AndroidRuntime(20119):在android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:389)
04-04 13:04:50.407:E/AndroidRuntime(20119):在android.os.Handler.dispatchMessage(Handler.java:99)上
04-04 13:04:50.407:E/AndroidRuntime(20119):在android.os.Looper.loop(Looper.java:137)
04-04 13:04:50.407:E/AndroidRuntime(20119):在android.app.ActivityThread.main(ActivityThread.java:4918)上
04-04 13:04:50.407:E/AndroidRuntime(20119):位于java.lang.reflect.Method.Invokenactive(本机方法)
04-04 13:04:50.407:E/AndroidRuntime(20119):位于java.lang.reflect.Method.invoke(Method.java:511)
04-04 13:04:50.407:E/AndroidRuntime(20119):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
04-04 13:04:50.407:E/AndroidRuntime(20119):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
04-04 13:04:50.407:E/AndroidRuntime(20119):在dalvik.system.NativeStart.main(本机方法)
似乎崩溃发生在第95行,即“.execute();”
谁能给我一些关于我该做什么的建议吗?谢谢 您是否搜索了错误“android.os.NetworkOnMainThreadException”?你会发现Android 3.0及更高版本对于在UI线程上运行网络更为严格。我更关心的是,我认为错误在于执行AccessTokenResponse之间的某个地方。所以我猜我必须创建一个异步任务吗?谢谢你的提示Morrison,我不知道这个问题已经被问了很多次了。我想我在寻找错误的问题。我已经略读了一遍,但即将再次深入。您的代码可能存在其他问题,但首先必须将其放入AsyncTask中。可能存在的重复