Android OAuth2.0适用于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

我现在对oAuth有点意见。这是我一直在处理的一个示例代码,它在2.2上运行得非常完美,但当我在4.1上测试它时,我会遇到强制关闭错误

下面是我一直在处理的示例代码:

 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中。可能存在的重复