2014-09-11 48 views
2

第二次請求訪問令牌不起作用,這就是爲什麼我們需要第一次存儲令牌以便將來使用它這就是我在嘗試使用SharedPreference發佈tweet時在Twitter中進行的嘗試。它在發佈tweet時第一次正常工作,但在第二次顯示彈出窗口時顯示「您無權訪問appname.Please返回到appname繼續註冊過程「。在Twitter集成中第二次使用RequestToken顯示彈出窗口「您無權訪問應用程序名稱」

private class TokenGet extends AsyncTask<String, String, String> { 
     @Override 
     protected String doInBackground(String... args) { 
      try { 
       if(requestTokenFirstTime) { 
        requestToken = twitter.getOAuthRequestToken(); 
        oauth_url = requestToken.getAuthorizationURL(); 
        //   requestTokenFirstTime = false; 
        // } 
        SharedPreferences.Editor edit = pref.edit(); 

        edit.putString("Request_TOKEN", requestToken.getToken()); 
        edit.putString("Request_TOKEN_SECRET", requestToken.getTokenSecret()); 
        edit.putString("OAUTH_URLT", oauth_url); 
        edit.commit(); 
        requestTokenFirstTime = false; 
       } 
       else { 

        requestToken = new RequestToken(pref.getString("Request_TOKEN", ""), pref.getString("Request_TOKEN_SECRET", "")); 


        oauth_url = pref.getString("OAUTH_URLT", "null"); 
       } 

      } catch (TwitterException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return oauth_url; 
     } 

下面是我完整的代碼TwitterFragment.java TwitterFragment.java

public class TwitterFragment extends ListFragment { 
    final static String ScreenName = "IBL_Official"; 
    final static String LOG_TAG = "rnc"; 
    private FragmentActivity myContext; 
    private ListFragment activity; 
    private ListView listView; 
    public static EditText tx1; 
    private ProgressBar mDialog; 
    private QuickReturnFrameLayout searchLayout; 
Button login; 
    boolean requestTokenFirstTime = true; 
    twitter4j.Twitter twitter; 
    RequestToken requestToken = null; 
    //static RequestToken requestToken ; 
    twitter4j.auth.AccessToken accessToken; 
    String oauth_url,oauth_verifier,profile_url; 
    Dialog auth_dialog; 
    WebView web; 
    SharedPreferences pref; 
    ProgressDialog progress; 
    Bitmap bitmap; 
    @Override 
    public void onAttach(Activity activity) { 

     if (activity instanceof FragmentActivity) { 
      myContext = (FragmentActivity) activity; 
     } 
     super.onAttach(activity); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.activity = this; 

     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     downloadTweets(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.twit_list, container, false); 
     listView = (ListView) rootView.findViewById(android.R.id.list); 
     tx1=(EditText)rootView.findViewById(R.id.postcomment); 
     mDialog = (ProgressBar) rootView.findViewById(R.id.progress_bar); 
     searchLayout = (QuickReturnFrameLayout) rootView.findViewById(R.id.search_layout); 
     listView.setVerticalScrollBarEnabled(false); 
     ((QuickReturnFrameLayout) rootView.findViewById(R.id.search_layout)).attach(listView); 
     rootView.setVerticalScrollBarEnabled(false); 
     login = (Button)rootView.findViewById(R.id.postbutton); 
     pref = getActivity().getPreferences(0); 
     twitter = new TwitterFactory().getInstance(); 
     twitter.setOAuthConsumer(pref.getString("CONSUMER_KEY", ""), pref.getString("CONSUMER_SECRET", "")); 
     login.setOnClickListener(new LoginProcess()); 

     return rootView; 
    } 


    public void downloadTweets() { 
     ConnectivityManager connMgr = (ConnectivityManager) myContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 

     if (networkInfo != null && networkInfo.isConnected()) { 
      new DownloadTwitterTask().execute(ScreenName); 
     } else { 
      Log.v(LOG_TAG, "No network connection available."); 
     } 
    } 

    public class DownloadTwitterTask extends AsyncTask<String, Void, String> { 
     final static String CONSUMER_KEY = "AuSSA6AHeCv9gskRhGQjSymCO"; 
     final static String CONSUMER_SECRET = "eyRoYBONVh45V185TBYbbb3i9BpWmmaiv4wLbBYXd7UcZGGaDw"; 
     final static String TwitterTokenURL = "https://api.twitter.com/oauth2/token"; 
     final static String TwitterStreamURL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name="; 

     @Override 
     public String doInBackground(String... screenNames) { 
      String result = null; 

      if (screenNames.length > 0) { 
       result = getTwitterStream(screenNames[0]); 
      } 
      return result; 
     } 

     @Override 
     public void onPreExecute() { 

     } 

     @Override 
     public void onPostExecute(String result) { 
      mDialog.setVisibility(View.GONE); 
      searchLayout.setVisibility(View.VISIBLE); 
      listView.setVisibility(View.VISIBLE); 


      Twitte twits = jsonToTwitter(result); 

      System.out.println(result); 

      ArrayList<String> data = new ArrayList<String>(); 
      ArrayList<String> link = new ArrayList<String>(); 
      ArrayList<String> time = new ArrayList<String>(); 
      String logoimage = ""; 
      String name = ""; 
      String officialname = ""; 
      for (Tweet tweet : twits) { 

       String[] splitted = tweet.getText().split("http://"); 
       Log.d("splitted", String.valueOf(splitted.length)); 
       data.add(splitted[0]); 
       if (splitted.length > 1) { 
        link.add("http://" + splitted[1]); 
       } else { 
        link.add(""); 
       } 
       logoimage = tweet.getUser().getProfileImageUrl(); 
       name = tweet.getUser().getName(); 
       officialname = "@ " + tweet.getUser().getScreenName(); 
       time.add(tweet.getDateCreated()); 
      } 
      // 
      Bitmap image = null; 
      try { 
       URL url = new URL(logoimage); 
       image = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
       image = getRoundedShape(image); 
      } catch (Exception e) { 
       Log.d("error in image", e.toString()); 
       Log.d("image", logoimage); 
      } 

      try { 
       TwitterAdapter adapter = new TwitterAdapter(getActivity(), data, link, image, time, name, officialname); 

       listView.setAdapter(adapter); 

      } catch (Exception e) { 
       System.out.println("error"); 
      } 
     } 

     public Twitte jsonToTwitter(String result) { 
      Twitte twits = null; 
      if (result != null && result.length() > 0) { 
       try { 
        Gson gson = new Gson(); 
        twits = gson.fromJson(result, Twitte.class); 
       } catch (IllegalStateException ex) { 

       } 
      } 
      return twits; 
     } 

     public Authenticated jsonToAuthenticated(String rawAuthorization) { 
      Authenticated auth = null; 
      if (rawAuthorization != null && rawAuthorization.length() > 0) { 
       try { 
        Gson gson = new Gson(); 
        auth = gson.fromJson(rawAuthorization, Authenticated.class); 
       } catch (IllegalStateException ex) { 

       } 
      } 
      return auth; 
     } 

     public String getResponseBody(HttpRequestBase request) { 
      StringBuilder sb = new StringBuilder(); 
      try { 

       DefaultHttpClient httpClient = new DefaultHttpClient(new BasicHttpParams()); 
       HttpResponse response = httpClient.execute(request); 
       int statusCode = response.getStatusLine().getStatusCode(); 
       String reason = response.getStatusLine().getReasonPhrase(); 

       if (statusCode == 200) { 

        HttpEntity entity = response.getEntity(); 
        InputStream inputStream = entity.getContent(); 

        BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
        String line = null; 
        while ((line = bReader.readLine()) != null) { 
         sb.append(line); 
        } 
        inputStream.close(); 
       } else { 
        sb.append(reason); 
       } 
      } catch (UnsupportedEncodingException ex) { 
      } catch (ClientProtocolException ex1) { 
      } catch (IOException ex2) { 
      } 
      return sb.toString(); 
     } 

     public String getTwitterStream(String screenName) { 
      String results = null; 

      try { 

       String urlApiKey = URLEncoder.encode(CONSUMER_KEY, "UTF-8"); 
       String urlApiSecret = URLEncoder.encode(CONSUMER_SECRET, "UTF-8"); 


       String combined = urlApiKey + ":" + urlApiSecret; 


       String base64Encoded = Base64.encodeToString(combined.getBytes(), Base64.NO_WRAP); 

       HttpPost httpPost = new HttpPost(TwitterTokenURL); 
       httpPost.setHeader("Authorization", "Basic " + base64Encoded); 
       httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
       httpPost.setEntity(new StringEntity("grant_type=client_credentials")); 
       String rawAuthorization = getResponseBody(httpPost); 
       Authenticated auth = jsonToAuthenticated(rawAuthorization); 


       if (auth != null && auth.token_type.equals("bearer")) { 


        HttpGet httpGet = new HttpGet(TwitterStreamURL + screenName); 


        httpGet.setHeader("Authorization", "Bearer " + auth.access_token); 
        httpGet.setHeader("Content-Type", "application/json"); 

        results = getResponseBody(httpGet); 
       } 
      } catch (UnsupportedEncodingException ex) { 
      } catch (IllegalStateException ex1) { 
      } 
      return results; 
     } 

     public Bitmap getRoundedShape(Bitmap scaleBitmapImage) { 
      int targetWidth = 50; 
      int targetHeight = 50; 
      Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
        targetHeight, Bitmap.Config.ARGB_8888); 

      Canvas canvas = new Canvas(targetBitmap); 
      Path path = new Path(); 
      path.addCircle(((float) targetWidth - 1)/2, 
        ((float) targetHeight - 1)/2, 
        (Math.min(((float) targetWidth), 
          ((float) targetHeight))/2), 
        Path.Direction.CCW 
      ); 

      canvas.clipPath(path); 
      Bitmap sourceBitmap = scaleBitmapImage; 
      canvas.drawBitmap(sourceBitmap, 
        new Rect(0, 0, sourceBitmap.getWidth(), 
          sourceBitmap.getHeight()), 
        new Rect(0, 0, targetWidth, targetHeight), null 
      ); 
      return targetBitmap; 
     } 
    } 
    private class LoginProcess implements OnClickListener { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      new TokenGet().execute(); 
     }} 
    private class TokenGet extends AsyncTask<String, String, String> { 
     @Override 
     protected String doInBackground(String... args) { 
      try { 
       if(requestTokenFirstTime) { 
        requestToken = twitter.getOAuthRequestToken(); 
        oauth_url = requestToken.getAuthorizationURL(); 
        //   requestTokenFirstTime = false; 
        // } 
        SharedPreferences.Editor edit = pref.edit(); 

        edit.putString("Request_TOKEN", requestToken.getToken()); 
        edit.putString("Request_TOKEN_SECRET", requestToken.getTokenSecret()); 
        edit.putString("OAUTH_URLT", oauth_url); 
        edit.commit(); 
        requestTokenFirstTime = false; 
       } 
       else { 

        requestToken = new RequestToken(pref.getString("Request_TOKEN", ""), pref.getString("Request_TOKEN_SECRET", "")); 


        oauth_url = pref.getString("OAUTH_URLT", "null"); 
       } 

      } catch (TwitterException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return oauth_url; 
     } 
     @Override 
     protected void onPostExecute(String oauth_url) { 
      if(oauth_url != null){ 
       Log.e("URL", oauth_url); 
       auth_dialog = new Dialog(getActivity()); 
       auth_dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
       auth_dialog.setContentView(R.layout.auth_dialog); 
       web = (WebView)auth_dialog.findViewById(R.id.webv); 
       web.getSettings().setJavaScriptEnabled(true); 
       web.loadUrl(oauth_url); 
       web.setWebViewClient(new WebViewClient() { 
        boolean authComplete = false; 
        @Override 
        public void onPageStarted(WebView view, String url, Bitmap favicon){ 
         super.onPageStarted(view, url, favicon); 
        } 
        @Override 
        public void onPageFinished(WebView view, String url) { 
         super.onPageFinished(view, url); 
         if (url.contains("oauth_verifier") && authComplete == false){ 
          authComplete = true; 
          Log.e("Url",url); 
          Uri uri = Uri.parse(url); 
          oauth_verifier = uri.getQueryParameter("oauth_verifier"); 
          auth_dialog.dismiss(); 
          new AccessTokenGet().execute(); 
         }else if(url.contains("denied")){ 
          auth_dialog.dismiss(); 
          Toast.makeText(getActivity(), "Sorry !, Permission Denied", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 
       auth_dialog.show(); 
       auth_dialog.setCancelable(true); 
      }else{ 
       Toast.makeText(getActivity(), "Sorry !, Network Error or Invalid Credentials", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
    private class AccessTokenGet extends AsyncTask<String, String, Boolean> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      progress = new ProgressDialog(getActivity()); 
      progress.setMessage("Fetching Data ..."); 
      progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      progress.setIndeterminate(true); 
      progress.show(); 
     } 
     @Override 
     protected Boolean doInBackground(String... args) { 
      try { 

        accessToken = twitter.getOAuthAccessToken(requestToken, oauth_verifier); 
        SharedPreferences.Editor edit = pref.edit(); 
        edit.putString("ACCESS_TOKEN", accessToken.getToken()); 
        edit.putString("ACCESS_TOKEN_SECRET", accessToken.getTokenSecret()); 
        User user = twitter.showUser(accessToken.getUserId()); 
        profile_url = user.getOriginalProfileImageURL(); 

        edit.putString("NAME", user.getName()); 
        edit.putString("IMAGE_URL", user.getOriginalProfileImageURL()); 
        edit.commit(); 

      } catch (TwitterException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return true; 
     } 
     @Override 
     protected void onPostExecute(Boolean response) { 
      if(response){ 
       progress.hide(); 
       // progress.dismiss(); 

       Fragment profile = new ProfileFragment(); 
       FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction(); 
       ft.replace(R.id.frame_container, profile); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.addToBackStack(null); 
       ft.commit(); 
      } 
      else{ 

       auth_dialog.dismiss(); 
      } 

     } 
    } 
} 

回答

0

我想你可能只是想掛在第一次嘗試後的OAuth訪問令牌(或自討苦吃通過調用twitter.getOAuthAccessToken())並重新使用它第二次。

我遇到過類似的經歷,我發現twitter4j.Twitter twitter;實例在我第一次嘗試時已經有一個與此實例關聯的訪問令牌。因此,當我向請求令牌(oauth_url = requestToken.getAuthorizationURL();)詢問身份驗證URL並在網頁中打開它時,我收到了類似於問題描述的消息(「您無權訪問請返回以繼續註冊過程」。) 。

我想如果你想要你也可以通過重新創建twitter4j.Twitter實例和相關的實例變量(如RequestToken)重新開始。但是,這也需要您再次執行整個身份驗證過程,並重復您在第一次嘗試時所做的相同工作。

相關問題