2014-01-28 2 views
0
public class Foursquare { 

private static final String LOGIN = "oauth"; 
public static final String API_END_POING_BASE_URL = "https://api.foursquare.com/v2/"; 
public static String REDIRECT_URI; 
public static final String API_URL = "https://foursquare.com/oauth2/"; 
//public static final String CANCEL_URI = ""; 
public static final String TOKEN = "access_token"; 
public static final String EXPIRES = "expires_in"; 
public static final String SINGLE_SIGN_ON_DISABLED = "service_disabled"; 
public static String AUTHENTICATE_URL = "https://foursquare.com/oauth2/authenticate";// + 

private String mClientId; 
private String mClientSecret; 
private String mAccessToken = null; 

private DialogListener mAuthDialogListener; 

public Foursquare(String clientId, String clientSecret, String redirectUrl) { 
    if (clientId == null || clientSecret == null) { 
     throw new IllegalArgumentException(
       "You must specify your application ID when instantiating " 
         + "a Foursquare object. See README for details."); 
    } 
    mClientId = clientId; 
    mClientSecret = clientSecret; 
    REDIRECT_URI = redirectUrl; 
} 

public void authorize(Activity activity, final DialogListener listener) { 
    mAuthDialogListener = listener; 
    startDialogAuth(activity); 
} 

public void startDialogAuth(Activity activity) { 
    CookieSyncManager.createInstance(activity); 
    Bundle params = new Bundle(); 
    dialog(activity, LOGIN, params, new DialogListener() { 

     public void onComplete(Bundle values) { 
      // ensure any cookies set by the dialog are saved 
      CookieSyncManager.getInstance().sync(); 
      String _token = values.getString(TOKEN); 
      setAccessToken(_token); 
      // setAccessExpiresIn(values.getString(EXPIRES)); 
      if (isSessionValid()) { 
       Log.d("Foursquare-authorize", 
         "Login Success! access_token=" + getAccessToken()); 
       mAuthDialogListener.onComplete(values); 
      } else { 
       mAuthDialogListener.onFoursquareError(new FoursquareError(
         "Failed to receive access token.")); 
      } 
     } 

     public void onError(DialogError error) { 
      Log.d("Foursquare-authorize", "Login failed: " + error); 
      mAuthDialogListener.onError(error); 
     } 

     public void onFoursquareError(FoursquareError error) { 
      Log.d("Foursquare-authorize", "Login failed: " + error); 
      mAuthDialogListener.onFoursquareError(error); 
     } 

     public void onCancel() { 
      Log.d("Foursquare-authorize", "Login canceled"); 
      mAuthDialogListener.onCancel(); 
     } 
    }); 
} 

public void dialog(Context context, String action, Bundle parameters, 
     final DialogListener listener) { 

    String endpoint = ""; 

    parameters.putString("client_id", mClientId); 
    parameters.putString("display", "touch"); 
    if (action.equals(LOGIN)) { 
     endpoint = AUTHENTICATE_URL; 
     parameters.putString("client_secret", mClientSecret); 
     parameters.putString("response_type", "token"); 
     parameters.putString("redirect_uri", REDIRECT_URI); 
    } 

    //  if (isSessionValid()) { 
    //   parameters.putString(TOKEN, getAccessToken()); 
    //  } 
    String url = endpoint + "?" + Util.encodeUrl(parameters); 
    if (context.checkCallingOrSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED) { 
     Util.showAlert(context, "Error", 
       "Application requires permission to access the Internet"); 
    } else { 
     new FoursquareDialog(context, url, listener).show(); 
    } 
} 

public boolean isSessionValid() { 
    if (getAccessToken() != null) { 
     return true; 
    } 
    return false; 
} 

public void setAccessToken(String token) { 
    mAccessToken = token; 
} 

public String getAccessToken() { 
    return mAccessToken; 
} 

public String request(String graphPath) throws MalformedURLException, 
IOException { 
    return request(graphPath, new Bundle(), "GET"); 
} 

public String request(String graphPath, Bundle parameters) 
     throws MalformedURLException, IOException { 
    return request(graphPath, parameters, "GET"); 
} 

public String request(String graphPath, Bundle params, String httpMethod) 
     throws FileNotFoundException, MalformedURLException, IOException { 
    params.putString("format", "json"); 
    if (isSessionValid()) { 
     params.putString("oauth_token", getAccessToken()); 
    } 
    String url = API_END_POING_BASE_URL + graphPath; 
    return Util.openUrl(url, httpMethod, params); 
} 

public static interface DialogListener { 

    /** 
    * Called when a dialog completes. 
    * 
    * Executed by the thread that initiated the dialog. 
    * 
    * @param values 
    *   Key-value string pairs extracted from the response. 
    */ 
    public void onComplete(Bundle values); 

    /** 
    * Called when a Foursquare responds to a dialog with an error. 
    * 
    * Executed by the thread that initiated the dialog. 
    * 
    */ 
    public void onFoursquareError(FoursquareError e); 

    /** 
    * Called when a dialog has an error. 
    * 
    * Executed by the thread that initiated the dialog. 
    * 
    */ 
    public void onError(DialogError e); 

    /** 
    * Called when a dialog is canceled by the user. 
    * 
    * Executed by the thread that initiated the dialog. 
    * 
    */ 
    public void onCancel(); 

} 

} я использую функциональность foursqure в моем приложении, в котором указанных пользователях любых данных так что пользователь может обмениваться на foursqure .., проблема, когда я использую «StrictMode» функциональность в моем OnCreate., Его не давая мне ошибка., но когда я не использую его, даю мне neton minthread exception , я получаю это исключение в foursqure.when диалог загружается, что я делаю, помогите мне, спасибо ... :) вот мой logcat logcatандроидная сеть при исполнении mainthread?

+1

вы должны использовать AsyncTask для этого ... – Piyush

+0

@laalto сэр .., когда я использую вариант StrictMode, я не получаю любая ошибка, мой ответ, но я немного путаюсь, где использовать асинхронную задачу в приложении? Можете ли вы мне помочь? – rajshree

+0

, но это не хорошо для всех, что вам нужно использовать AsyncTask. – Piyush

ответ

2

Сетевые операции, как правило, занимают некоторое время. Поэтому на Android запрещается выполнять сетевые задачи в потоке пользовательского интерфейса (переднего плана). Если вы попробуете, система выкинет NetworkingOnMainThreadException.

Вы должны перенести свой сетевой код на фоновый поток. Самый простой способ сделать это, используя AsyncTask.

+0

ok sir я пытаюсь .. :) – rajshree

Смежные вопросы