Android向けのwhoisクライアントの作成

ロゴ



前回の記事で、 htmlを解析するためのライブラリが非常に多いと言いました。今回は、タグを「キャッチ」して言及されたライブラリを使用することができない正規表現を使用してテキストから情報を抽出する方法を示すことにしました。 最初はすべて小さなアプリケーションから始まりましたが、徐々に新しいものを思いつきました。その結果、私にとっては非常に興味深いことがわかりました。



カットの下で、開発プロセスについて説明し、作業と開発オプションの例を示します。



そもそも、市場にあるものを調査することに決めたので、市場を見て、「whois」キーワードを使用していくつかのアプリケーションをダウンロードしました。すぐに、アプリケーションがIDNドメインで機能するという点でユニークであることに気付きました。 キリル文字のドメイン名。



開発



私のアプリケーションの最初の顕著な特徴は、キリル文字ドメインのサポートであり、2番目は「認識された」データを出力することです。 ダウンロードしたアプリケーションとは異なり、データ出力のあるブロックを簡単に取得して解析し、WebViewに出力するダウンロードされたアプリケーションとは異なり、どの行、どのデータが配置されているかが明確にわかります。興味のある情報:



whoisブロック



スクリーンショットは、タグが実質的に存在せず、このテキストを壊すのに役立つXPathがないことを示しているため、プロジェクトの作成と作業を開始します。



新しいプロジェクト



今回は、SDKをダウンロードするための最小バージョンを選択することにしました。少し後で、ハブで2.1と2.2が現在最も人気のあるバージョンであると読みました。



今回はインターフェイスにもっと注意を払いました。そのため、完全なxmlインターフェイスファイルをアップロードすることはできませんでした。



主な要素は次のとおりです。

< EditText android:layout_height ="wrap_content"

android:layout_width ="fill_parent"

android:id ="@+id/site"

android:maxLines ="1"

android:text ="" >

</ EditText >

< Button android:text ="@string/get"

android:id ="@+id/getData"

android:layout_width ="fill_parent"

android:layout_height ="wrap_content"

android:background ="@layout/custom_button" >

</ Button >

< ListView android:id ="@+id/whoisList"

android:layout_width ="wrap_content"

android:layout_height ="wrap_content" >

</ ListView >




* This source code was highlighted with Source Code Highlighter .






EditTextでは、サイトを示します。ここではandroid:maxLines = "1"を指定したため、複数の行を入力することはできません。 ボタンは解析を開始するために使用されますが、ボタンのシンプルなスタイルを設定するには、多くのPCアプリケーションよりもいくつかのジェスチャが必要であることが判明したため、Android設定用に別のファイルを使用します:background = "@ layout / custom_button" 。 ListViewは、一見しただけでは単純ではありません。2つの列で構成される別の行を作成したためです。



インターフェイスファイル:

main.xml-メインファイル

custom_button.xml-ボタンのスタイル

color.xml-

row.xml-行リストビュー



その結果、左のスクリーンショットが表示されます(ただし、定数の文字列を自分で設定するか、記事の最後に移動してプロジェクトをダウンロードする必要があります)。



インターフェース



すべてのスクリーンショットを2つにまとめたため、投稿が長くなりすぎないように、すぐに「Get whois data」ボタンをクリックした後のProgressDialogの結果が右側にあると言います。 上で書いたように、利用できるのは1行だけなので、ボタンを押して新しい行に転送しようとすると、入力が終了し、すぐにキーボードが非表示になります。

EditText edittext = (EditText)findViewById(R.id.site);

edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);








しかし、ユーザーはキーボードを非表示にして「Get whois data」ボタンを押さないため、プログラムで非表示にします。

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

imm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);








また、画面にメッセージを呼び出してみました。



メッセージ



左手:

Toast.makeText(MainActivity. this , " ..." , Toast.LENGTH_LONG).show();







そして右側に表示されます:

AlertDialog.Builder alertbox = new AlertDialog.Builder(MainActivity. this );

alertbox.setMessage( " " );

alertbox.setNeutralButton( "Ok" , new DialogInterface.OnClickListener() {

public void onClick(DialogInterface arg0, int arg1) {

//

}

});

alertbox.show();




* This source code was highlighted with Source Code Highlighter .






2番目のメッセージはより重要なので、ユーザーがそれを読むことを確認する必要があります。このためにAlertDialogを使用します。



サードパーティのライブラリを使用してドメインを翻訳します。 これを使用して、「site.rf」から文字セット「xn-80aswg.xn-p1ai」を取得できます。

import gnu.inet.encoding.IDNA;

IDNA.toASCII( "." );








多くの人が、なぜjava.net.idnを使用しないのかと言いますが、ドキュメントでは9 APIのみであり、7のAPIがあることを示しています。私のテストでは、7-8 APIではインポートが機能しないことも示されました。 9本当にすべてが問題なく、次のコードはライブラリなしで正常に動作します。



ここで、既に説明したように、解析に直接渡します。正規表現を使用します。

HashMap< String , String > map;

Pattern p = Pattern.compile( "created:\\s+(\\d{4}\\.\\d{2}\\.\\d{2})\n" , Pattern.CASE_INSENSITIVE);

Matcher matcher = p.matcher(str);

if (matcher.find()) {

map = new HashMap< String , String >();

map.put( "param" , ":" );

map.put( "value" , matcher.group(1));

list.add(map);

}




* This source code was highlighted with Source Code Highlighter .






「作成:\\ s +(\\ d {4} \\。\\ d {2} \\。\\ d {2})\ n "-yyyy.dd.MMまたはyyyy.MM.ddの形式の日付

「Person:\\ s +(。+)\ N」-スペースと改行の間の任意の文字セットが改行に戻ります

「電話:\\ s +(\\ + [\\ s \\ d] +)\ n」-+(プラス)およびスペースと数字の間のスペースとキャリッジ改行で改行

「メール:\\ s +(。+)\ N」-スペースと改行の間の任意の文字セットを改行に戻す

「レジストラ:\\ s +(。+)\ N」-スペースと改行の間の任意の文字セットが改行に戻ります

「Org:\\ s +(。+)\ N」-スペースと改行の間にある任意の文字セット



実際には、2つのオプションしかありません。ライブラリを使用して、探しているデータが含まれるコードブロックのみを取得し、さらに、innertextを取得することを使用します。 多くのレジストラがタグを追加します-これらはmailtoへのリンク、例のようなサイトへのリンクなどです。 または、サーバーからの応答全体を正規表現で実行します(ページが過度に過負荷になっていないレジストラを選択しようとしました)。



結果を取得したら、それをListViewにロードできます。

ListView list = (ListView) findViewById(R.id.whoisList);

SimpleAdapter myAdapter = new SimpleAdapter(MainActivity. this , mylist, R.layout.row,

new String [] { "param" , "value" },

new int [] {R.id.whoisParam, R.id.whoisData});

list.setAdapter(myAdapter);




* This source code was highlighted with Source Code Highlighter .






2つのサイトの作業の結果は次のようになります。



サイト



そして最後にしたいことは、メニューと別のアクティビティを追加することでした:

Menu myMenu = null ;



@Override

public boolean onCreateOptionsMenu(Menu menu)

{

//call the parent to attach any system level menus

super.onCreateOptionsMenu(menu);



this .myMenu = menu;



int base = Menu.FIRST; // value is 1

MenuItem item = menu.add( base , base , base , "" );

item.setIcon(R.drawable.help);



//it must return true to show the menu

//if it is false menu won't show

return true ;

}



@Override

public boolean onOptionsItemSelected(MenuItem item) {

if (item.getItemId() == 1) {

Intent intent = new Intent(MainActivity. this , Help. class );

startActivity(intent);

}

//should return true if the menu item

//is handled

return true ;

}




* This source code was highlighted with Source Code Highlighter .






ここでメニューを作成し、メニューボタンを押す処理を行います。その後、次の画像が表示されます(左側はメニューが呼び出された後、右側はボタンがクリックされた後のフォームです)。 閉じるには、2番目のアクティビティでfinish()を呼び出します。



メニュー



私がほとんど忘れていたのはマニフェストファイルだけです。マニフェストファイルでは、インターネットの使用と新しいアクティビティの存在に必ず言及する必要があります。 完成したプロジェクトは次のとおりです。



プロジェクト



ダウンロードリンク: プロジェクトミラー



まとめ



かなり興味深いアプリケーションが判明したように思えますが、今回は多くの開発オプションがあります。 このアプリケーションは将来、かなり興味深いseoツールになる可能性があります。他のドメインゾーンのサイトを追加し、PageRank、TICを取得し、結果をデータベースに保存できます。 一般に、このアイデアは無限に開発できるように思えますが、Webサービスを作成することを決定した人たちに同意します。Androidアプリケーションは、単一のサイトからデータを受信するクライアントとして使用され、もちろんトラフィックを節約します。より速く走ります。




All Articles