なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Androidでデータベース

Androidではデータベースとしてsqliteが用意されており気軽に使えるようになっている.
ただし,多少仕様が異なるのでそのメモを記述しておく

sqliteをしようするには,まず抽象クラスのSQLiteOpenHelpeを継承したクラスを用意して,これからデータベースのインスタンスを取得する.

インスタンスを取得できれば,あとはほとんど,普通のsqliteと同様に使える.
インスタンスのexecSQLで第一引数にStringでデータベース操作命令を,第2引数にnullをつっこんでやれば,とりあえず他のsqliteと同じ感覚で使える.

ただし!!

SELECT文 だけはこのメソッドではなぜか使えなくて,SELECTを使いたいときはrawQueryメソッドを用いなければならない決まりになっているみたい.
スポンサーサイト

AndroidアプリによるAdmobの収入の可能性について

 先日自分のアプリにAdmobの広告を組み込んだ.アプリにこれを組み込むと,アプリに広告が表示されるようになり,その広告がクリックされるとアプリの開発者に収入が入る(おそらくい1クリックで1セント)

 グーグルもアドセンスとかいうので同じことをやっているが,これはAdMobと違い参加資格が必要で,超人気アプリの開発者しか組み込むことはできないようだ.

 それで,AdMobが儲かるかというと,かなり難しいように思える.今までに広告を表示して収入を得るようなことをしたことがないので一般的かどうかは分からないが,クリック単価というのはかなりシビアに感じる.
これはつまり,広告自体が千回表示されようが,1億回表示されようが誰も広告をクリックしなければ1セントも収入を得られない.

ゆえに,AdMobで設けるには,超人気アプリを開発してそれに広告を組み込むか,それほど人気がなくても,思わず広告をクリックしてしまうようなアプリ(詐欺っぽいような気が...)で攻めていくしかないように思う

AndroidアプリをAdmobに登録してみた

自分のAndroidアプリをAdmobに登録してみた.

基本的なやり方はhttp://typea.info/tips/wiki.cgi?page=Android+AdMob#p13とかを参考にして行なったが,いくつかはまった点があるのでそのメモを書いておく

AdMobSDKの古い仕様のようなものでAndroidのマニフェストファイルに

app:test="true"みたいな

書き方をすることにより確認のためのテスト広告を表示させるものがあるが,現在(2010/7/29)は仕様が変わったみたいで別の書き方をするようなので上記のような記述は不要.新しい仕様でのテストモードの記述方法について調べれば見つけることができるが別にそんなことをしなくてもAdMobに自社広告に何でもいいので広告を登録しておけばAdMob側が広告がないときに自社広告が表示されるのでテストモードにしなくても確認可能だった.



PublisherIDをマニフェストファイルに記述するときに記述する場所によってはアプリ実行時にIDが特定できない場合があった.

</application>

の直前に
<meta-data android:value="あなたのID" android:name="ADMOB_PUBLISHER_ID"/>

記述するのが良いっぽい



そして今回AdMobを導入するにあたり大変だったのが自前で用意したオリジナルのViewインスタンスとAdMobの広告表示用のViewを共存させることだった.

今回はこの問題をLinearLayoutを用いることで解決した.
以下onCreate関数内

//オリジナルなViewと広告を共存させるために使う
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
//layout を 登録する
setContentView(layout);

/*
レイアウトxmlからViewインスタンスを次の方法で取得する

(注)View v = findViewById(R.layout.main);
でViewインスタンスは取得できず,このようにすると実行時にエラーが起こる
「inflate」する必要があるらしい,まあよく分からなければとりあえずこの例の
ようにすればうまくいくと思われる.
*/
View v = this.getLayoutInflater().inflate(R.layout.main, null);
layout.addView(v);
layout.addView(new MyOriginalView(this));




感想:
AdMobは単価が広告に対するクリック数で決まるのでなかなか難しく,現在広告もあまり多くなく自社広告が表示されることもよくあるので,AdMobの広告で一儲けするにはかなり努力する必要があるようだ.

AndroidでBluetooth5

AndroidをクライアントとしたBluetootを利用したPC(Python)との通信がうまくいったのでメモっときます。

いままでうまくいかなかった原因:Pybluezのadvertise_serviceメソッドの引数が求められていたものと違った。

今までは、ネット上に落ちているサンプルコードを参考にして、


uuid = "fa87c0d0-afac-11de-8a39-0800200c9a66"

advertise_service( server_sock, "SampleServer",
service_id = uuid,
service_classes = [ uuid, SERIAL_PORT_CLASS ],
profiles = [ SERIAL_PORT_PROFILE ] )
とかいうふうにしていたが、
これを

uuid = "fa87c0d0-afac-11de-8a39-0800200c9a66"

advertise_service( server_sock, "SampleServer",
service_id = uuid,
service_classes = [ uuid] )
こんな風に書き換えるとうまくいった。

それでは今回の実験に使用した、コードを掲載しておく。
マニフェストのxmlファイルは前回と同じ感じでだと思うので省力する。

このプログラムは、デバイス取得ボタンを押すことにより、ペアリングしているデバイス情報を取得し、
サーバーに接続ボタンで、1番最初に取得したデバイス情報からアドレスをとりだし、そのアドレスに対して接続を試みる。

res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<Button android:text="デバイス取得" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="サーバーに接続" android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>



BluetoothClient.java

package foo.bar.BTClient;

import java.util.Set;
import java.util.UUID;
import java.util.Vector;

import foo.bar.BTClient.R.id;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class BluetoothClient extends Activity implements OnClickListener {

/** Called when the activity is first created. */
private static final UUID MY_UUID = UUID.fromString("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
Button b1,b2;
Communication comu;
Vector<BluetoothDevice> devices = new Vector<BluetoothDevice>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b1 = (Button)findViewById(id.Button01);
b2 = (Button)findViewById(id.Button02);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
}
public void onClick(View v)
{
if(v.getId()==b1.getId())
{
BluetoothAdapter bt_adapter = BluetoothAdapter.getDefaultAdapter();
if(bt_adapter==null)
{
Toast.makeText(this, "この端末ではBluetoothは利用できません。", Toast.LENGTH_LONG);
finish();
}
if(!bt_adapter.isEnabled())
{
Intent enable_bt = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(enable_bt);
}
//もしBluetoothがONに最初からなっていたら
else
{
//getBoundedDevicesによってピアリングが既になされているデバイスを取得する
Set<BluetoothDevice> paired_devices = bt_adapter.getBondedDevices();
//BluetoothDeviceのインスタンスをdevicesインスタンスに追加していく
for(BluetoothDevice device : paired_devices)
{
devices.addElement(device);
}
//devicesに保存されたBluetoothDeviceインスタンスを利用して順番に情報をログに出力していく
for(int i=0;i<devices.size();i++) Log.d("debug",devices.elementAt(i).getName()+":"+devices.elementAt(i).getAddress());

}
}
else if(v.getId()==b2.getId())
{
Log.d("debug","b2 was touched");
Log.d("debug","devices.size="+devices.size());
if(!devices.isEmpty())
{
Log.d("debug","try Communication with "+devices.elementAt(0).getName());
comu = new Communication(devices.elementAt(0), MY_UUID);
Log.d("debug","before run()");
comu.start();
}
else{
Log.d("debug","b2 else");
Toast.makeText(this, "ピアリングされているデバイスがみつかりません", Toast.LENGTH_LONG);
}


}

}
}


Communication.java

package foo.bar.BTClient;

import java.io.IOException;
import java.util.UUID;

import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.util.Log;

public class Communication extends Thread{
private BluetoothSocket bs;

Communication(BluetoothDevice device,UUID uuid)
{
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("debug","create failed");
e.printStackTrace();
}
bs = tmp;


}
public void run()
{
try {
bs.connect();
} catch (IOException e) {
Log.d("debug","connect failed");
e.printStackTrace();
return;
}
while(true)
{
try {
bs.getOutputStream().write("this is Android".getBytes());
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("debug","outputStream.write failed");
e.printStackTrace();
}

}

}
}




PC(Python側)Pybluezモジュールが必要

from bluetooth import *

ss=BluetoothSocket( RFCOMM )
ss.bind(("",PORT_ANY))
ss.listen(1)

port = ss.getsockname()[1]

uuid = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

advertise_service( ss, "FooBar", service_id = uuid,service_classes=[uuid])
print "Waiting for connection on RFCOMM channel %d" % port
client_sock, client_info = ss.accept()


いま気づいたんだけど、このJavaのほうのプログラムのToast....の部分、最後に.show()を書き加えるの忘れてるから、表示されないね。なるほど。
コピペして使うときは.show()を加えるの忘れずに。なくても一応動く。

AndroidでBluetooth4

ようやくコードの書き方が分かってきた。
ここでは、Androidは、Bluetoothサーバーになってacceptして接続を待ち、Python(PC)側ではサーバーを探して接続しにいく。

接続が完了したら、Android側はとりあえずひたすらメッセージを送り続け、python側はひたすらそれを受け続ける。

どちらのコードも最低限必要なところのみにして簡潔にしたつもりなので、参考になるといいなあ。
pythonが短いのはもちろん、Android側もかなり短い。少なくともgoogleのチャットサンプルより。
もっとこういうサンプルを何種類か用意してくれればソースコードを大量に読むはめにならずにすんだのに。

で、Python側は短いので対話モードで動かしていたんだけど、first_mach(↓のPythonソース参考)の中をみてたら、なんだかAndroid側をクライアントにしてPCとBluetooth通信できそうな気が少ししたので休憩したら、試してみる。


Android側

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="foo.bar.BTServer"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".BluetoothServer"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>
<uses-sdk android:minSdkVersion="6" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
</manifest>


BluetoothServer.java

package foo.bar.BTServer;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class BluetoothServer extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

public void onStart() {
super.onStart();
BluetoothAdapter my_bluetooth = BluetoothAdapter.getDefaultAdapter();
if (my_bluetooth == null) {
Log.d("debug", "Bluetooth can't use");
finish();
}

if (!my_bluetooth.isEnabled()) {
Log.d("debug", "Restart with setting Bluetooth on");
finish();
} else {
Communication comu = new Communication(my_bluetooth);
comu.start();
}

}
}


Communication.java

package foo.bar.BTServer;

import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.util.Log;

public class Communication extends Thread {
private BluetoothServerSocket bss;
private BluetoothSocket bs;
private OutputStream os;
private static final String NAME = "ANY NAME";
private static final UUID MYID = UUID
.fromString("12345678-1234-1234-1234-123456789abc");

public Communication(BluetoothAdapter my_bluetooth) {
// TODO Auto-generated constructor stub
try {
bss = my_bluetooth.listenUsingRfcommWithServiceRecord(NAME, MYID);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public void run() {
try {
Log.d("debug", "start accept");
bs = bss.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("debug", "accept NG");
e.printStackTrace();
return;
}
Log.d("debug", "accept OK");
try {
os = bs.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("debug", "getOutputStream NG");
e.printStackTrace();
return;
}
Log.d("debug", "getOutputStream OK");
while (true) {
try {
os.write("Hello Python".getBytes());
sleep(1000);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("debug", "os.write NG");
e.printStackTrace();
return;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
Log.d("debug", "sleep NG");
e.printStackTrace();
return;
}
}

}

}



Python側

import sys
import bluetooth

uuid = "12345678-1234-1234-1234-123456789abc"
service_matches = bluetooth.find_service( uuid = uuid )

first_match = service_matches[0]
port = first_match["port"]
name = first_match["name"]
host = first_match["host"]

sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.connect((host, port))
while True: print sock.recv(1024)




Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。