Java Android misfit API OAuth 2:如何保存访问令牌

Java Android misfit API OAuth 2:如何保存访问令牌,java,android,oauth-2.0,access-token,misfit,Java,Android,Oauth 2.0,Access Token,Misfit,使用以下android代码,我可以做到这一点: 在我的Android智能手机上向我的用户显示身份验证页面 以有效用户身份使用我的凭据登录此页面 捕获身份验证代码 请参阅smarthpone webview上的access\u令牌 public class MainActivity extends AppCompatActivity { public static String OAUTH_URL = "https://api.misfitwearables.com/auth

使用以下android代码,我可以做到这一点:

  • 在我的Android智能手机上向我的用户显示身份验证页面
  • 以有效用户身份使用我的凭据登录此页面
  • 捕获身份验证代码
  • 请参阅smarthpone webview上的access\u令牌

    public class MainActivity extends AppCompatActivity
    {
    public static           String OAUTH_URL = "https://api.misfitwearables.com/auth/dialog/authorize";
    public static           String OAUTH_ACCESS_TOKEN_URL = "https://api.misfitwearables.com/auth/tokens/exchange";
    public static           String CLIENT_ID = "my id";
    public static           String CLIENT_SECRET = "my secret code";
    public static           String CALLBACK_URL = "just a simple url";
    public static           String SCOPE = "public,birthday,email,tracking,session,sleep";
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.other);
    
        String url = OAUTH_URL+ "?response_type=code" +"&client_id=" + CLIENT_ID+ "&redirect_uri=" + CALLBACK_URL + "&scope=" + SCOPE;
    
        WebView webview = (WebView) findViewById(R.id.aaa);
        webview.getSettings().setJavaScriptEnabled(true);
    
        webview.setWebViewClient(new WebViewClient() {
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                String accessTokenFragment = "access_token=";
                String accessCodeFragment = "code=";
                if (url.contains(accessCodeFragment))
                {
                    String accessCode = url.substring(url.indexOf(accessCodeFragment));
                    String query = "grant_type=authorization_code" + "&client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET + "&" + accessCode + "&redirect_uri=" + CALLBACK_URL;
                    view.postUrl(OAUTH_ACCESS_TOKEN_URL, query.getBytes());
                    System.out.println("url:" + url);
                    System.out.println(accessCode);
                }
                System.out.println(url);
                if (url.contains(accessTokenFragment)) {
                    String accessToken = url.substring(url.indexOf(accessTokenFragment));
                    url = url.replace("#", "?");
                    //view.loadUrl(url);
                    System.out.println("token=" + accessToken);
                }
            }
        });
        webview.loadUrl(url);
    }
    
    }

正如我上面所说,我设法在我的webview、smarthpone上显示access_令牌。但我无法捕获这个令牌,以发出get请求来恢复用户的数据。 我是java/android的新手,但我有一些C语言的技能。 我只是花时间去发现Java,所以我在这方面的技能是有限的。
有人能给我建议吗?

我找到了一些代码,并制作了一个运行良好的Android应用程序

Main

package com.example.vta.webview_example;

/*
 * Note that I was a complete novice in Java and Android when I was writting this.
 * Note that I found pieces of code that I adapted for my needs.
 */

import org.apache.http.HttpStatus;
import org.json.JSONException;
import org.json.JSONObject;


import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Calendar;

public class MainActivity extends Activity
{
    private static String CLIENT_ID = "your ID_CLIENT code";
    private static String CLIENT_SECRET ="your SECRET_CLIENT code";
    private static String REDIRECT_URI="http://localhost";
    private static String GRANT_TYPE="authorization_code";
    private static String TOKEN_URL ="https://api.misfitwearables.com/auth/tokens/exchange";
    private static String OAUTH_URL ="https://api.misfitwearables.com/auth/dialog/authorize";
    private static String OAUTH_SCOPE="public,birthday,email,tracking,session,sleep";

    WebView                 web;
    Button                  auth;
    SharedPreferences       pref;
    TextView                Access;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pref = getSharedPreferences("AppPref", MODE_PRIVATE);
        Access =(TextView)findViewById(R.id.Access);
        auth = (Button)findViewById(R.id.auth);
        auth.setOnClickListener(new View.OnClickListener()
        {
            Dialog auth_dialog;
            @Override
            public void onClick(View arg0)
            {
                auth_dialog = new Dialog(MainActivity.this);
                auth_dialog.setContentView(R.layout.auth_dialog);
                web = (WebView)auth_dialog.findViewById(R.id.webv);
                web.getSettings().setJavaScriptEnabled(true);
                web.loadUrl(OAUTH_URL+"?redirect_uri="+REDIRECT_URI+"&response_type=code&client_id="+CLIENT_ID+"&scope="+OAUTH_SCOPE);
                web.setWebViewClient(new WebViewClient()
                {
                    boolean     authComplete = false;
                    Intent      resultIntent = new Intent();
                    String      authCode;

                    @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("?code=") && authComplete != true)
                        {
                            Uri uri = Uri.parse(url); //Create an uri, identical to the url
                            System.out.println("=====> uri <===== \n" + uri);
                            authCode = uri.getQueryParameter("code"); //Parse the uri to fond the first occurence of "code", and extract his value
                            Log.i("", "CODE : " + authCode);
                            System.out.println("=====> code <===== \n" + authCode);
                            authComplete = true;
                            resultIntent.putExtra("code", authCode);
                            MainActivity.this.setResult(Activity.RESULT_OK, resultIntent);
                            setResult(Activity.RESULT_CANCELED, resultIntent);
                            SharedPreferences.Editor edit = pref.edit();
                            edit.putString("Code", authCode);
                            edit.commit();
                            auth_dialog.dismiss();
                            new TokenGet().execute();
                            Toast.makeText(getApplicationContext(),"Authorization Code is: " +authCode, Toast.LENGTH_SHORT).show();
                        }
                        else if(url.contains("error=access_denied"))
                        {
                            Log.i("", "ACCESS_DENIED_HERE");
                            resultIntent.putExtra("code", authCode);
                            authComplete = true;
                            setResult(Activity.RESULT_CANCELED, resultIntent);
                            Toast.makeText(getApplicationContext(), "Error Occured", Toast.LENGTH_SHORT).show();
                            auth_dialog.dismiss();
                        }
                    }
                });
                auth_dialog.show();
                auth_dialog.setTitle("Authorize Misfit");
                auth_dialog.setCancelable(true);
            }
        });
    }

    private class TokenGet extends AsyncTask<String, String, JSONObject>
    {
        private ProgressDialog pDialog;
        String Code;
        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Contacting Misfit ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            Code = pref.getString("Code", "");
            pDialog.show();
        }

        @Override
        protected JSONObject doInBackground(String... args)
        {
            GetAccessToken jParser = new GetAccessToken();
            JSONObject json = jParser.gettoken(TOKEN_URL,Code,CLIENT_ID,CLIENT_SECRET,REDIRECT_URI,GRANT_TYPE);
            System.out.println("=====> json <===== \n" + json);
            return json;
        }

        @Override
        protected void onPostExecute(JSONObject json)
        {
            pDialog.dismiss();
            if (json != null)
            {
                try
                {
                    final String tok = json.getString("access_token");
                    Log.d("Token Access", tok);
                    System.out.println("TOKN = " + tok);
                    auth.setText("Authenticated");
                    Access.setText("Access Token:" + tok);
                }
                catch (JSONException e)
                {
                    e.printStackTrace();
                }
                getRequestToMisfit(json);
            }
            else
            {
                Toast.makeText(getApplicationContext(), "Network Error", Toast.LENGTH_SHORT).show();
                pDialog.dismiss();
            }
        }
    }

    public void getRequestToMisfit(JSONObject json)
    {
        try
        {
            URL                     url;
            HttpURLConnection       connection;
            String                  tok;
            InputStream             is;
            BufferedReader          rd;
            String                  line;
            String                  responseStr;
            StringBuffer            response;
            String                  end_date;
            String                  today;
            String                  start_date;
            Context                 context;
            File                    file;
            File                    file_value;
            String                  filepath;
            String                  filepath_value;
            String                  result;

            result = null;
            context = MyApp.getContext();
            connection = null;
            rd = null;
            tok = json.getString("access_token");
            FileManagement fm = new FileManagement();
            Calendar c = Calendar.getInstance();
            String d = String.valueOf(c.get(Calendar.DAY_OF_MONTH));
            String m = String.valueOf((c.get(Calendar.MONTH) + 1));
            String y = String.valueOf(c.get(Calendar.YEAR));
            today = y + "-" + m + "-" + d;
            end_date = new String(today);
            filepath = context.getFilesDir().getPath().toString() + "/sync_date.txt";
            filepath_value = context.getFilesDir().getPath().toString() + "/sync_value.txt";
            file = new File(filepath);
            file_value = new File(filepath_value);

            //IF YOU WANT TO SIMULATE AN OLD SYNC
            //fm.writeToFile("2016-03-28", filepath);

            //If you want to delete file that contain previous synchronisation date
            //fm.deleteFile(file);
            if ((start_date = fm.readFromFile(filepath, file)) == null)
                start_date = new String(today);

            //String dataUrl = "https://api.misfitwearables.com/move/resource/v1/user/me/profile?access_token=" + tok;
            String dataUrl = "https://api.misfitwearables.com/move/resource/v1/user/me/activity/summary?start_date="+start_date+"&end_date="+end_date+"&access_token=" + tok;
            System.out.println("=====> access_token <===== \n" + tok);
            try
            {
                // Create connection
                url = new URL(dataUrl);
                setContentView(R.layout.activity_main);
                TextView wv = (TextView) findViewById(R.id.misfit);
                System.out.println("=====> url <===== \n" + url);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
                //if setDoOutput is set to "true", HttpUrlConnection will send POST request.
                connection.setDoOutput(false);
                // Send request
                int status = connection.getResponseCode();
                // Get Response
                if(status >= HttpStatus.SC_BAD_REQUEST)
                    is = connection.getErrorStream();
                else
                    is = connection.getInputStream();
                rd = new BufferedReader(new InputStreamReader(is));
                response = new StringBuffer();
                while ((line = rd.readLine()) != null)
                {
                    System.out.println("line = " + line);
                    response.append(line);
                    response.append('\r');
                }
                rd.close();
                responseStr = response.toString();
                JSONObject json_res = new JSONObject(responseStr);
                System.out.println("JSON_OBJ" + json_res);
                result = json_res.getString("points");
                Log.d("Server response", responseStr);
                System.out.println(responseStr);
                System.out.println(start_date);
                System.out.println(end_date);
                System.out.println(result);
                wv.setText("nombre de point :\ndu " + start_date + " au " + end_date + "\n" + "***   " + result + "   ***");
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (connection != null)
                    connection.disconnect();
                if (rd != null)
                {
                    try
                    {
                        rd.close();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
            if (!file.exists())
            {
                try
                {
                    file.createNewFile();
                    file.mkdir();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            fm.writeToFile(today, filepath);
            if (!file_value.exists())
            {
                try
                {
                    file_value.createNewFile();
                    file_value.mkdir();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            fm.writeToFile(result, filepath_value);
            System.out.println(fm.readFromFile(filepath_value, file));
            Toast.makeText(context, "Result added to file ==> OK", Toast.LENGTH_LONG);
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
    }

}
package com.example.vta.webview_example;

/*
 * Find on
 * http://stackoverflow.com/questions/22499066/invalid-client-in-jsonresponse-in-oauth2-android
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


public class GetAccessToken
{
    static InputStream      is = null;
    static JSONObject       jObj = null;
    static String           json = "";

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    Map<String, String> mapn;
    DefaultHttpClient httpClient;
    HttpPost httpPost;

    public GetAccessToken()
    {
    }

    public JSONObject gettoken(String address,String token,String client_id,String client_secret,String redirect_uri,String grant_type)
    {
        // Making HTTP request
        try
        {
            // DefaultHttpClient
            httpClient = new DefaultHttpClient();
            httpPost = new HttpPost(address);

            params.add(new BasicNameValuePair("code", token));
            params.add(new BasicNameValuePair("client_id", client_id));
            params.add(new BasicNameValuePair("client_secret", client_secret));
            params.add(new BasicNameValuePair("redirect_uri", redirect_uri));
            params.add(new BasicNameValuePair("grant_type", grant_type));

            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        catch (ClientProtocolException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            BufferedReader      reader;
            StringBuilder       sb;
            String              line;
            reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            sb = new StringBuilder();
            line = null;
            while ((line = reader.readLine()) != null)
            {
                System.out.println("=+=+=+> getAccessToken : line <+=+=+= \n" + line);
                sb.append(line + "\n");
            }
            is.close();

            json = sb.toString();
            System.out.println("=+=+=+> getAccessToken : json <+=+=+= \n" + json);
            Log.e("JSONStr", json);
        }
        catch (Exception e)
        {
            e.getMessage();
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // Parse the String to a JSON Object
        try
        {
            jObj = new JSONObject(json);
        }
        catch (JSONException e)
        {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // Return JSON String
        return jObj;
    }

}
package com.example.vta.webview\u示例;
/*
*请注意,当我写这篇文章时,我是Java和Android的完全新手。
*请注意,我找到了适合自己需要的代码片段。
*/
导入org.apache.http.HttpStatus;
导入org.json.JSONException;
导入org.json.JSONObject;
导入android.content.Context;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.app.Activity;
导入android.app.Dialog;
导入android.app.ProgressDialog;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.graphics.Bitmap;
导入android.os.StrictMode;
导入android.util.Log;
导入android.view.view;
导入android.webkit.WebView;
导入android.webkit.WebViewClient;
导入android.widget.Button;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.Calendar;
公共类MainActivity扩展了活动
{
私有静态字符串CLIENT\u ID=“您的ID\u客户端代码”;
私有静态字符串CLIENT\u SECRET=“您的SECRET\u客户端代码”;
私有静态字符串重定向_URI=”http://localhost";
私有静态字符串GRANT_TYPE=“authorization_code”;
私有静态字符串标记\u URL=”https://api.misfitwearables.com/auth/tokens/exchange";
私有静态字符串OAUTH_URL=”https://api.misfitwearables.com/auth/dialog/authorize";
私有静态字符串OAUTH_SCOPE=“public、生日、电子邮件、跟踪、会话、睡眠”;
网络视图;
按钮验证;
共享参考优先;
文本视图访问;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pref=getSharedReferences(“AppPref”,MODE_PRIVATE);
Access=(TextView)findViewById(R.id.Access);
auth=(按钮)findviewbyd(R.id.auth);
auth.setOnClickListener(新视图.OnClickListener()
{
对话框身份验证对话框;
@凌驾
公共void onClick(视图arg0)
{
auth_dialog=新建对话框(MainActivity.this);
auth_dialog.setContentView(R.layout.auth_dialog);
web=(WebView)auth_dialog.findviewbyd(R.id.webv);
web.getSettings().setJavaScriptEnabled(true);
web.loadUrl(OAUTH_URL+“?重定向_uri=“+redirect_uri+”&response_type=code&client_id=“+client_id+”&scope=“+OAUTH_scope”);
setWebViewClient(新的WebViewClient()
{
布尔authComplete=false;
Intent resultent=新Intent();
字符串验证码;
@凌驾
public void onPageStarted(WebView视图、字符串url、位图favicon)
{
super.onPageStarted(视图、url、favicon);
}
@凌驾
公共void onPageFinished(WebView视图,字符串url)
{
super.onPageFinished(视图、url);
if(url.contains(“?code=”)&&authComplete!=true)
{
Uri=Uri.parse(url);//创建一个与url相同的Uri
System.out.println(“===>uri代码json访问\u令牌url确定”,Toast.LENGTH\u LONG);
}
捕获(JSONException e)
{
e、 printStackTrace();
}
}
}
GetAccessToken

package com.example.vta.webview_example;

/*
 * Note that I was a complete novice in Java and Android when I was writting this.
 * Note that I found pieces of code that I adapted for my needs.
 */

import org.apache.http.HttpStatus;
import org.json.JSONException;
import org.json.JSONObject;


import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Calendar;

public class MainActivity extends Activity
{
    private static String CLIENT_ID = "your ID_CLIENT code";
    private static String CLIENT_SECRET ="your SECRET_CLIENT code";
    private static String REDIRECT_URI="http://localhost";
    private static String GRANT_TYPE="authorization_code";
    private static String TOKEN_URL ="https://api.misfitwearables.com/auth/tokens/exchange";
    private static String OAUTH_URL ="https://api.misfitwearables.com/auth/dialog/authorize";
    private static String OAUTH_SCOPE="public,birthday,email,tracking,session,sleep";

    WebView                 web;
    Button                  auth;
    SharedPreferences       pref;
    TextView                Access;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pref = getSharedPreferences("AppPref", MODE_PRIVATE);
        Access =(TextView)findViewById(R.id.Access);
        auth = (Button)findViewById(R.id.auth);
        auth.setOnClickListener(new View.OnClickListener()
        {
            Dialog auth_dialog;
            @Override
            public void onClick(View arg0)
            {
                auth_dialog = new Dialog(MainActivity.this);
                auth_dialog.setContentView(R.layout.auth_dialog);
                web = (WebView)auth_dialog.findViewById(R.id.webv);
                web.getSettings().setJavaScriptEnabled(true);
                web.loadUrl(OAUTH_URL+"?redirect_uri="+REDIRECT_URI+"&response_type=code&client_id="+CLIENT_ID+"&scope="+OAUTH_SCOPE);
                web.setWebViewClient(new WebViewClient()
                {
                    boolean     authComplete = false;
                    Intent      resultIntent = new Intent();
                    String      authCode;

                    @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("?code=") && authComplete != true)
                        {
                            Uri uri = Uri.parse(url); //Create an uri, identical to the url
                            System.out.println("=====> uri <===== \n" + uri);
                            authCode = uri.getQueryParameter("code"); //Parse the uri to fond the first occurence of "code", and extract his value
                            Log.i("", "CODE : " + authCode);
                            System.out.println("=====> code <===== \n" + authCode);
                            authComplete = true;
                            resultIntent.putExtra("code", authCode);
                            MainActivity.this.setResult(Activity.RESULT_OK, resultIntent);
                            setResult(Activity.RESULT_CANCELED, resultIntent);
                            SharedPreferences.Editor edit = pref.edit();
                            edit.putString("Code", authCode);
                            edit.commit();
                            auth_dialog.dismiss();
                            new TokenGet().execute();
                            Toast.makeText(getApplicationContext(),"Authorization Code is: " +authCode, Toast.LENGTH_SHORT).show();
                        }
                        else if(url.contains("error=access_denied"))
                        {
                            Log.i("", "ACCESS_DENIED_HERE");
                            resultIntent.putExtra("code", authCode);
                            authComplete = true;
                            setResult(Activity.RESULT_CANCELED, resultIntent);
                            Toast.makeText(getApplicationContext(), "Error Occured", Toast.LENGTH_SHORT).show();
                            auth_dialog.dismiss();
                        }
                    }
                });
                auth_dialog.show();
                auth_dialog.setTitle("Authorize Misfit");
                auth_dialog.setCancelable(true);
            }
        });
    }

    private class TokenGet extends AsyncTask<String, String, JSONObject>
    {
        private ProgressDialog pDialog;
        String Code;
        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Contacting Misfit ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            Code = pref.getString("Code", "");
            pDialog.show();
        }

        @Override
        protected JSONObject doInBackground(String... args)
        {
            GetAccessToken jParser = new GetAccessToken();
            JSONObject json = jParser.gettoken(TOKEN_URL,Code,CLIENT_ID,CLIENT_SECRET,REDIRECT_URI,GRANT_TYPE);
            System.out.println("=====> json <===== \n" + json);
            return json;
        }

        @Override
        protected void onPostExecute(JSONObject json)
        {
            pDialog.dismiss();
            if (json != null)
            {
                try
                {
                    final String tok = json.getString("access_token");
                    Log.d("Token Access", tok);
                    System.out.println("TOKN = " + tok);
                    auth.setText("Authenticated");
                    Access.setText("Access Token:" + tok);
                }
                catch (JSONException e)
                {
                    e.printStackTrace();
                }
                getRequestToMisfit(json);
            }
            else
            {
                Toast.makeText(getApplicationContext(), "Network Error", Toast.LENGTH_SHORT).show();
                pDialog.dismiss();
            }
        }
    }

    public void getRequestToMisfit(JSONObject json)
    {
        try
        {
            URL                     url;
            HttpURLConnection       connection;
            String                  tok;
            InputStream             is;
            BufferedReader          rd;
            String                  line;
            String                  responseStr;
            StringBuffer            response;
            String                  end_date;
            String                  today;
            String                  start_date;
            Context                 context;
            File                    file;
            File                    file_value;
            String                  filepath;
            String                  filepath_value;
            String                  result;

            result = null;
            context = MyApp.getContext();
            connection = null;
            rd = null;
            tok = json.getString("access_token");
            FileManagement fm = new FileManagement();
            Calendar c = Calendar.getInstance();
            String d = String.valueOf(c.get(Calendar.DAY_OF_MONTH));
            String m = String.valueOf((c.get(Calendar.MONTH) + 1));
            String y = String.valueOf(c.get(Calendar.YEAR));
            today = y + "-" + m + "-" + d;
            end_date = new String(today);
            filepath = context.getFilesDir().getPath().toString() + "/sync_date.txt";
            filepath_value = context.getFilesDir().getPath().toString() + "/sync_value.txt";
            file = new File(filepath);
            file_value = new File(filepath_value);

            //IF YOU WANT TO SIMULATE AN OLD SYNC
            //fm.writeToFile("2016-03-28", filepath);

            //If you want to delete file that contain previous synchronisation date
            //fm.deleteFile(file);
            if ((start_date = fm.readFromFile(filepath, file)) == null)
                start_date = new String(today);

            //String dataUrl = "https://api.misfitwearables.com/move/resource/v1/user/me/profile?access_token=" + tok;
            String dataUrl = "https://api.misfitwearables.com/move/resource/v1/user/me/activity/summary?start_date="+start_date+"&end_date="+end_date+"&access_token=" + tok;
            System.out.println("=====> access_token <===== \n" + tok);
            try
            {
                // Create connection
                url = new URL(dataUrl);
                setContentView(R.layout.activity_main);
                TextView wv = (TextView) findViewById(R.id.misfit);
                System.out.println("=====> url <===== \n" + url);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
                //if setDoOutput is set to "true", HttpUrlConnection will send POST request.
                connection.setDoOutput(false);
                // Send request
                int status = connection.getResponseCode();
                // Get Response
                if(status >= HttpStatus.SC_BAD_REQUEST)
                    is = connection.getErrorStream();
                else
                    is = connection.getInputStream();
                rd = new BufferedReader(new InputStreamReader(is));
                response = new StringBuffer();
                while ((line = rd.readLine()) != null)
                {
                    System.out.println("line = " + line);
                    response.append(line);
                    response.append('\r');
                }
                rd.close();
                responseStr = response.toString();
                JSONObject json_res = new JSONObject(responseStr);
                System.out.println("JSON_OBJ" + json_res);
                result = json_res.getString("points");
                Log.d("Server response", responseStr);
                System.out.println(responseStr);
                System.out.println(start_date);
                System.out.println(end_date);
                System.out.println(result);
                wv.setText("nombre de point :\ndu " + start_date + " au " + end_date + "\n" + "***   " + result + "   ***");
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (connection != null)
                    connection.disconnect();
                if (rd != null)
                {
                    try
                    {
                        rd.close();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
            if (!file.exists())
            {
                try
                {
                    file.createNewFile();
                    file.mkdir();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            fm.writeToFile(today, filepath);
            if (!file_value.exists())
            {
                try
                {
                    file_value.createNewFile();
                    file_value.mkdir();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            fm.writeToFile(result, filepath_value);
            System.out.println(fm.readFromFile(filepath_value, file));
            Toast.makeText(context, "Result added to file ==> OK", Toast.LENGTH_LONG);
        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
    }

}
package com.example.vta.webview_example;

/*
 * Find on
 * http://stackoverflow.com/questions/22499066/invalid-client-in-jsonresponse-in-oauth2-android
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;


public class GetAccessToken
{
    static InputStream      is = null;
    static JSONObject       jObj = null;
    static String           json = "";

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    Map<String, String> mapn;
    DefaultHttpClient httpClient;
    HttpPost httpPost;

    public GetAccessToken()
    {
    }

    public JSONObject gettoken(String address,String token,String client_id,String client_secret,String redirect_uri,String grant_type)
    {
        // Making HTTP request
        try
        {
            // DefaultHttpClient
            httpClient = new DefaultHttpClient();
            httpPost = new HttpPost(address);

            params.add(new BasicNameValuePair("code", token));
            params.add(new BasicNameValuePair("client_id", client_id));
            params.add(new BasicNameValuePair("client_secret", client_secret));
            params.add(new BasicNameValuePair("redirect_uri", redirect_uri));
            params.add(new BasicNameValuePair("grant_type", grant_type));

            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        catch (ClientProtocolException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            BufferedReader      reader;
            StringBuilder       sb;
            String              line;
            reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            sb = new StringBuilder();
            line = null;
            while ((line = reader.readLine()) != null)
            {
                System.out.println("=+=+=+> getAccessToken : line <+=+=+= \n" + line);
                sb.append(line + "\n");
            }
            is.close();

            json = sb.toString();
            System.out.println("=+=+=+> getAccessToken : json <+=+=+= \n" + json);
            Log.e("JSONStr", json);
        }
        catch (Exception e)
        {
            e.getMessage();
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // Parse the String to a JSON Object
        try
        {
            jObj = new JSONObject(json);
        }
        catch (JSONException e)
        {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // Return JSON String
        return jObj;
    }

}
package com.example.vta.webview\u示例;
/*
*发现
* http://stackoverflow.com/questions/22499066/invalid-client-in-jsonresponse-in-oauth2-android
*/
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.UnsupportedEncodingException;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Map;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.ClientProtocolException;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.message.BasicNameValuePair;
导入org.json.JSONException;
导入org.json.JSONObject;
导入android.util.Log;
公共类GetAccessToken
{
静态InputStream为空;
静态JSONObject jObj=null;
静态字符串json=“”;
List params=new ArrayList();
地图地图;
默认httpClient httpClient;
HttpPost-HttpPost;
公共GetAccessToken()
{
}
公共JSONObject gettoken(字符串地址、字符串令牌、字符串客户端id、字符串cl