AndroidアプリケーションからVkontakteウォールに投稿を追加します

みなさんこんにちは! 帰ってきた。



VKontakteウォールへの投稿の公開に関する投稿をすでに数人が待っています。 そしてこの記事。 そこには多くのコードがありますが、理論はまったくありません。すべてが非常にシンプルであるにもかかわらず、この投稿はこの問題の解決方法について困惑している人にとって有用です。



行こう





先史時代



まず、利用可能なオプションを探しました。 彼らはそこにいなかったので、私はツイッターとフェイスブックの既製のソリューションに注意を喚起し、後者の例としてVKのいくつかのクラスを書きました。

この例のアイデアは、Facebook SDKから引用されています。FacebookSDKは、Facebook SDKで入手できます。



どのように機能しますか?



プロジェクト(もちろん強力に聞こえますが、わかりました...プロジェクト)は、3つのクラス(記事の最後にあるカブへのリンク)で構成されています:VkSession-VKパラメーター(トークン、user_idなど)を保存/受信するためのクラス、VkDialog-ユーザーダイアログ、VkAppのためのクラス-すべてのクラスを結合し、主要な作業を実行するクラス。



実際、ここで説明することはありません。 VkontakteにはAPIに関するドキュメントがあります-APIのドック 。 関数wall.post-Tytsを見つけます。 読んで理解します。



OAuthの仕組みを理解することが重要です。 この場合、アプリケーションID(対応するフォームがあります)を取得し、APIを操作してこのIDを渡す必要があります。 APIを使用する場合、VkontakteはAccessTokenを送信します。これは保存する必要があります。 このトークンは24時間しか存続しないため、確認してトークンを受け取る時間を節約する必要があります。 これらのパラメーターをVkSessionクラスに結合しました。



package vkontakte; import android.content.Context; import android.content.SharedPreferences; public class VkSession { private SharedPreferences _prefs; private final String PREFS_NAME = "Vk:Settings"; private Context _context; private SharedPreferences.Editor _editor; public VkSession(){} public VkSession(Context context){ _context = context; _prefs = _context.getSharedPreferences(PREFS_NAME, 0); _editor = _prefs.edit(); } public void saveAccessToken(String accessToken, String expires, String userId){ _editor.putString("VkAccessToken", accessToken); _editor.putString("VkExpiresIn", expires); _editor.putString("VkUserId", userId); _editor.putLong("VkAccessTime", System.currentTimeMillis()); _editor.commit(); } public String[] getAccessToken(){ String[] params = new String[4]; params[0] = _prefs.getString("VkAccessToken", ""); params[1] = _prefs.getString("VkExpiresIn", ""); params[2] = _prefs.getString("VkUserId", ""); params[3] = String.valueOf(_prefs.getLong("VkAccessTime",0)); return params; } public void resetAccessToken(){ _editor.putString("VkAccessToken", ""); _editor.putString("VkExpiresIn", ""); _editor.putString("VkUserId", ""); _editor.putLong("VkAccessTime", 0); _editor.commit(); } }
      
      







ご覧のとおり、複雑なことはありません。 結果の設定はSharedPreferencesに保存されます。 まあ、それだけです。



次に、最も興味深い。 VkAppクラス、または説明付きの最も興味深い部分:



 public class VkApp { //constants for OAUTH AUTHORIZE in Vkontakte public static final String CALLBACK_URL = "http://api.vkontakte.ru/blank.html"; private static final String OAUTH_AUTHORIZE_URL = "http://api.vkontakte.ru/oauth/authorize?client_id=2020214&scope=8192&redirect_uri=http://api.vkontakte.ru/blank.html&display=touch&response_type=token"; private Context _context; private VkDialogListener _listener; private VkSession _vkSess; private String VK_API_URL = "https://api.vkontakte.ru/method/"; private String VK_POST_TO_WALL_URL = VK_API_URL + "wall.post?"; ...
      
      





説明します。 リクエストを送信すると、VKontakteはレスポンスを送信し、api.vkontakte.ru / blank.htmlにリダイレクトします 。本質的には空白のページです(作業の正確な本質を思い出せないので、長い間コードを書いたので、覚えておいてください)。 このアドレスを傍受し、正しい方法で応答することが重要です。 次に、必要なすべてのパラメーターを含む実際のクエリ文字列があります:識別子、スコープ(アクセス権)、表示タイプ、リーダーのアドレス、一般に、これらはすべてドックにあります。 読んで!



私たちは続けます:

  //parse vkontakte JSON response private boolean parseResponse(String jsonStr){ boolean errorFlag = true; JSONObject jsonObj = null; try { jsonObj = new JSONObject(jsonStr); JSONObject errorObj = null; if( jsonObj.has("error") ) { errorObj = jsonObj.getJSONObject("error"); int errCode = errorObj.getInt("error_code"); if( errCode == 14){ errorFlag = false; } } } catch (JSONException e) { e.printStackTrace(); } return errorFlag; } //publicate message to vk users' wall public boolean postToWall(String message) { boolean errorFlag = true; String[] params = _vkSess.getAccessToken(); String accessToken = params[0]; String ownerId = params[2]; //set request uri params VK_POST_TO_WALL_URL += "owner_id="+ownerId+"&message="+Uri.encode(message)+"&access_token="+accessToken; //send request to vkontakte api HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(VK_POST_TO_WALL_URL); try { HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); String responseText = EntityUtils.toString(entity); //parse response for error code or not errorFlag = parseResponse(responseText); } catch(ClientProtocolException cexc){ cexc.printStackTrace(); } catch(IOException ioex){ ioex.printStackTrace(); } return errorFlag; }
      
      





Androidには、リクエストの実行、受信、回答の解析などのためのApacheの便利なクラスのセットがあります -HttpClient。 この場合、GET要求を作成し、応答を受け取ります。



ダイアログはWebViewで構成され、クライアントはそのために再定義されます。



 private class VkWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith(VkApp.CALLBACK_URL) & ( !url.contains("error") )) { mListener.onComplete(url); VkDialog.this.dismiss(); return true; } else if(url.contains("error")){ VkDialog.this.dismiss(); return false; } else { view.loadUrl(url); return true; } } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); mListener.onError(description); VkDialog.this.dismiss(); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); if( url.contains("error") ) { VkDialog.this.dismiss(); return; } else if( url.contains("access_token")) { VkDialog.this.dismiss(); mListener.onComplete(url); return; } mSpinner.show(); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mSpinner.dismiss(); } }
      
      





クライアントコードでは、VKontakteからアプリケーションに送信されたアドレスをキャッチし、必要に応じて応答します。 すべても簡単です。 もちろん、このコードは最終決定する価値があり、理解せずに大胆にコピーするべきではありません。 サーバー上で何かが変更され、アプリケーションが誤って応答します。 ちなみに、付録では、Facebook SDKもストリーミングしていると言います。ほとんどの場合、HTC携帯電話でです。



この記事が役に立つことを願っています!



いつものように、PMで興味深い提案やコメントなどを書いています。



コードはこちらから入手できます- カブ



All Articles