Re: Androidでサーバと連携したい ( No.1 ) |
- 名前:管理人 日時:2020/03/03 01:01
|
Re: Androidでサーバと連携したい ( No.2 ) |
- 名前:たけのこ 日時:2020/03/03 19:49
お返事ありがとうございます。
情報不足で申し訳ございません。
管理人さんの仰るとおりローカルでSQLiteのようなデータベースにアクセスはせず、XammpのMysqlを利用しています。
Android端末 ←( HTTP通信 )→ WebAPIサーバー ←( SQL通信 )→ データベース
の流れで正しいです!
PHPでapiは作成済みなので、Http通信でサーバーにデータの送受信、GET、POSTができれば問題は解決すると思います。。。
可能であれば通信部分をご教授いただければ幸いです。
よろしくお願いいたします。
|
Re: Androidでサーバと連携したい ( No.3 ) |
- 名前:管理人 日時:2020/03/04 02:27
なるほど、HTTP の GET、POSTができれば問題解決なのですね
こちらの@a_nishimuraさんの記事では Java の API を使用して HTTP通信を行っているようです
<AndroidでのHTTP通信>
https://qiita.com/a_nishimura/items/19cf3f60ad1dd3f66a84
こちらの記事で使用されている API は Java 用なので、これを C++ から使うような
関数を作ろうと思うのですが、以下のような関数で大丈夫でしょうか?
// HTTP通信を行う
// URL : 接続するパス
// Method : "GET", "POST", "PUT" の何れか
// 戻り値 : HTTP通信ハンドル
int Android_HTTP_Connect( const char *URL, const char *Method ) ;
// HTTP通信の結果得られたデータのバッファを取得する
// HTTPConnectHandle : HTTP通信ハンドル
// BufferSize : バッファに格納されているデータのサイズ
// 戻り値 : データのバッファの先頭アドレス
void *Android_HTTP_GetBuffer( int HTTPConnectHandle, size_t *BufferSize ) ;
// HTTP通信ハンドルを閉じる
// HTTPConnectHandle : HTTP通信ハンドル
int Android_HTTP_Close( int HTTPHandle ) ;
|
Re: Androidでサーバと連携したい ( No.4 ) |
- 名前:たけのこ 日時:2020/03/04 12:17
@a_nishinuraさんの記事を参考にしてandroid studioにおいてはjavaでhttp通信を行うことができました。
管理人さんが仰るように、Javaで扱われているAPIをc++で使えればとても助かります。
通信先apiにデータをgetで送信して、最終的には通信先からJSONでデータを受け取れれば問題ないです。
上記の関数の実装、よろしくお願い致します。m(_ _)m
|
Re: Androidでサーバと連携したい ( No.5 ) |
- 名前:管理人 日時:2020/03/06 03:15
了解しました
早速関数を実装してみたのですが、通信API( Java の API)の一部がエラーの場合に例外を投げるように
なっていて、C言語からその関数を呼んだ場合 Android ではクラッシュしまうようです… orz
なので、改めて『通信API( Java の API )を呼ぶ Java の関数を作って、C言語からはその関数を呼ぶようにする』
という形のものを組んでみますので、もう暫くお待ちください m(_ _;m
|
Re: Androidでサーバと連携したい ( No.6 ) |
- 名前:たけのこ 日時:2020/03/06 14:08
そうなんですね。なかなか難しそうです、、、
何卒よろしくお願い致します。
|
Re: Androidでサーバと連携したい ( No.7 ) |
- 名前:管理人 日時:2020/03/07 15:32
お待たせしました、こちらに Java を使って HTTP通信を行う Java の関数を C言語側から
呼ぶということをするサンプルプログラムを載せましたので、よろしければご覧ください m(_ _)m
<DXライブラリ Android版を使用した Androidアプリで Java のコードで HTTP通信を行う>
https://dxlib.xsrv.jp/lecture/Android/Android_Java_HTTP.html
サンプル内で定義している関数は以下の通りです
( No.3 のものとは若干異なっています )
// HTTP通信を行う
// URL : 接続するパス
// Method : "GET", "POST", "PUT" の何れか
// 戻り値 : 0:成功 -1:エラー
int Android_HTTP_Connect( const char *URL, const char *Method )
// HTTP通信の結果を取得する
// 戻り値 : 通信の結果( 0:まだ通信中 1以上:HTTPレスポンスコード -2:IO例外発生 -3:MalformedURL例外発生 )
int Android_HTTP_GetResponseCode( void )
// HTTP通信の結果得られたデータのバッファを取得する
// BufferBytes : バッファに格納されているデータのサイズを保存する変数のアドレス
// 戻り値 : データのバッファの先頭アドレス
void *Android_HTTP_GetBuffer( size_t *BufferBytes )
サンプルでは WinMain 関数と同じソースに上記関数も書いてありますので、もし複数のソースから
使用する場合は独立した cpp と h に関数を移動してください
あと、受信用のバッファを 8MB の固定サイズとなっている若干雑な実装となっていますので、
もしサイズが足りない場合は固定サイズを増やすか、可変サイズにも対応できる形に変更してみてください m(_ _)m
|
Re: Androidでサーバと連携したい ( No.8 ) |
- 名前:たけのこ 日時:2020/03/07 01:29
丁寧に記事まで書いていただき本当にありがとうございます!
無事Http通信することが出来ました。
大変助かりました。ありがとうございました。
|
Re: Androidでサーバと連携したい ( No.9 ) |
- 名前:たけのこ 日時:2020/03/08 21:46
すみません。 http通信自体は出来たのですが,サーバのapcheのアクセスログで
(POST /Kadai/sample.php HTTP/1.1" 200 128 "-" "Dalvik/2.1.0 (Linux; U; Android 6.0; Android SDK built for x86 Build/MASTER)
と表示はされPHPにはたどり着いているのですが、どうやらクライアント側から値をPOST出来ていないようで、IOExceptionでエラーをキャッチしたのですが、
例外のエラー内容が出力できず原因がわからず困っています。
Android Studioで同じAPIレベルで同じEmulater(Galaxy Nexus API23)を使用して試したところ、問題なくパラメータをphpにPOSTできました。
プロジェクト内のAndroidManifest.xmlのsdkVersionの指定はこのようにしています <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="28"/>
javaのソースファイルに以下のコードを追加しました。
-------------------------------------------------------------------------
public class HTTP_ConnectTask extends Thread
{
public void run()
{
try{
HttpURLConnection HTTPCon = null ;
URL url = null ;// URLの作成
url = new URL( HTTP_URLString ) ;
// 接続用HttpURLConnectionオブジェクト作成
HTTPCon = ( HttpURLConnection )url.openConnection() ;
// メソッドタイプによって処理を分岐
switch( HTTP_MethodType )
{
case 0: // GET
HTTPCon.setRequestMethod( "GET" ) ;
HTTPCon.setDoOutput( false ) ;
break ;
case 1: // POST
HTTPCon.setRequestMethod( "POST" ) ;
HTTPCon.setDoOutput( true ) ;
break ;
case 2: // PUT
HTTPCon.setRequestMethod( "PUT" ) ;
HTTPCon.setDoOutput( true ) ;
break ;
}
HTTPCon.setDoInput( true ) ;
// レスポンスコードの取得
HTTP_ResponseCode = HTTPCon.getResponseCode();
//phpに渡すパラメータ
String parameter = "Date=2012&Beans=Brasil&Roaster=me&Note=bad&Rating=29";
//POST でパラメータをphpに渡す
try{
OutputStream outStream = HTTPCon.getOutputStream();
outStream.write( parameter.getBytes(StandardCharsets.UTF_8));
outStream.flush();
HTTP_ResponseCode = 999 ;
HTTPCon.connect() ;
}catch (IOException e){
HTTP_ResponseCode = -5 ;
}
以下略
-------------------------------------------------------------------------------
もし問題点が分かるようでしたら、教えていただけると幸いです。
よろしくお願い致します。
|
Re: Androidでサーバと連携したい ( No.10 ) |
- 名前:たけのこ 日時:2020/03/08 22:07
phpの方のエラーが出力できたので、もしかしたら解決できそうです。
|
Re: Androidでサーバと連携したい ( No.11 ) |
- 名前:管理人 日時:2020/03/09 05:07
なるほど、例外のエラーメッセージ…
例外が発生した場合、そのエラーメッセージを画面に表示するようにサンプルコードを書き換えてみましたので、
よろしければご覧ください m(_ _)m
<DXライブラリ Android版を使用した Androidアプリで Java のコードで HTTP通信を行う>
https://dxlib.xsrv.jp/lecture/Android/Android_Java_HTTP.html
サンプルに以下の関数を追加しました
// HTTP通信の例外メッセージを所得する
// 戻り値 : 例外のメッセージ文字列のポインタ
char *Android_HTTP_GetExceptionMessage( void ) ;
|