忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/23 07:14 】 |
androidでtwitter投稿機能
参考ページは以下。

http://qiita.com/gabu/items/673288c3a5b39f89aa92

twitterのアプリケーション登録ページは以下
https://apps.twitter.com/app


基本的に参考ページのコードを書き写せば良いが、
気をつける点いくつか。


・CallbackURLも設定する
CallbackURLとは、OAuth認証が済んだ後に戻る先のURLである。
androidアプリの場合設定は不要なのだが、(コードから設定するので)何かしら書いておく必要がある。何も書いていないと、コールバック自体をしなくなってしまうため。
何でもいいから適当に書いておく

マニフェストのTwitterOAuthActivityの中で、
コールバックURLをhost,schemeの形で指定する。
これが
scheme://host
の形でコールバックURLとして使われることになる。(スキームが先)






PR
【2015/05/24 15:12 】 | Android | 有り難いご意見(0)
multiple dex files define エラー
以下のようなエラーが出た。


Unable to execute dex: Multiple dex files define ****;
Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ****;

つまり、同名のファイルが複数存在していることが問題。

今回の場合、
Lcom/android/vending/billing/IInAppBillingService
がmultipleだというエラー。

元々自分でこのファイルを追加していた。
android公式の課金サンプルからコピペした
src/com/android/vending/billing/IInAppBillingService.aidl
をプロジェクトに追加していた。

で、その後
appCCloudのjarファイルを追加したところこのエラー。
appCCloudには課金機能も含まれているので、jar内にIInAppBillingServiceクラスの定義があったのだろう。


◯対処

そこで、自分でファイル追加していたsrc/以下のaidlファイルを削除。
aidlはインターフェース定義だけなので、実体は元々別にあるものなので
ここで削除しても問題ないはず。

で、やってみたらエラーが消えた。

【2015/05/23 18:52 】 | Android | 有り難いご意見(0)
androidでpush通知設定
大前提

google play developer console

google developers console
は別物。
とても紛らわしい


google play developer console
https://play.google.com/


google developers console
https://console.developers.google.com/



0.
google play developer consoleで、アプリを作成
これは済んでいる前提。
アプリ名もストアに並ぶものそのままで書いている。

1.
google developers consoleで、プロジェクトを作成。プロジェクト名はアプリ名と同じが良いだろう。ただし英数字しか使えない

2.
PUSH通知サービスを有効にする。
左タブ「APIと認証」を選択→APIを選択→「Google Cloud Messaging for Android」を有効にする


3.
左タブ「APIと認証」→認証情報から、「公開 API へのアクセス」の「新しいキーを作成」をクリック。
テスト用にIPアドレスは 「0.0.0.0/0」としておく。
すると、「API キー」が発行される。

4.
google play developer console
に移動

5.
アプリの「サービスとAPI」を選択→「GOOGLE クラウド メッセージング(GCM)」を作成。
先ほどの「APIキー」を入力。
すると「リンクしている送信者ID」が作成される
(appCCloud使用の場合は不要の手順)


appCCloudの場合

1.
google developers consoleのみ使用。

appCCloudの管理画面に行き
APIキーに「APIキー」を、
SenderIDに「プロジェクトID」(consoleの「概要」タブから確認)を入力

2.
appc_cloud_x.x.x.jarファイルをプロジェクトに追加

3.
AndroidManifest.xmlにappCCloud周りの必要事項を追記。
管理画面に書き方参考があるので、それを見てそのまま追記すればよい

4.
コード記述。
MainActivity.javaに以下の3行を追記するだけ

import net.app_c.cloud.sdk.AppCCloud; //<-ここ

public class MainActivity extends Cocos2dxActivity {
private AppCCloud appCCloud; //<-ここ
protected void onCreate(final Bundle savedInstanceState) {
appCCloud = new AppCCloud(this).on(AppCCloud.API.PUSH).start(); //<-ここ
}
}




5.
一度実機で起動。
アプリ起動のタイミングでデバイスがpush対象として登録される。

6.
管理画面からpush送信予約をする

7.
待つ。5分前後。
端末がpush通知受け取れる設定になってるか確認

8.
届けば成功



注意点
android-support-v4.jarが必要。エラーにはならないが実行時にワーニングが出る



【2015/05/23 18:03 】 | Android | 有り難いご意見(0)
Androidのアプリ内課金処理
ご多分に漏れずいろいろ罠がある。


1.
AndroidManifest.xmlに課金のパーミッション追加

<uses-permission android:name="com.android.vending.BILLING"></uses-permission>



2.
この状態でまずapkを一度作る。(課金部分は実装していなくてよい)

3.
作ったapkをgoogle play developer console から、ベータ版としてアップロード
なぜかというと、課金パーミッション付きのapkをアップロードしないと、商品の登録ができないからだ。

4.
課金アイテム他、各種情報を記入。

すべてを記入。

課金アイテムについて。
これは見れば分かる。
「有効」にするのを忘れずに。
プロダクトID(SKUとも言う)はアプリ内でユニークであればよい。なお大文字アルファベットは使えない。
一度使ったIDは、その後二度と使えなくなるので注意。
すべて記入を済ますことで、アプリのベータ公開ができるようになる。

5.
ベータ版を公開する
ここが必須!(これに気付かず数時間無駄にした)
公開していないと、この後課金処理を動かしたときに課金アイテム情報が取得できない。
ベータ版を公開しても、google playに公開される訳ではないので安心しよう。(google+でグループに招待したメンバーにだけ見えるようになる。その方法はここでは関係ないので触れない。)
公開には時間がかかる。consoleで「公開済み」の表示が出るまで待とう(数十分〜数時間)
(ベータ公開しないで実行すると、「指定したアイテムは購入できません」というエラーが出る)

6.
Eclipseを開く。
SDK Managerから、Google play billing library を追加。
$ANDROID_SDK_ROOT/extras/google/play_billing/ 以下のディレクトリができるので確認しておく。
AndroidStudioを開く。
ProjectStructureのDependenciesから、play-servicesを選択する。


以下、この記事を参考。
AndroidStudioでは、この記事も参考になった。

7.
$ANDROID_SDK_ROOT/extras/google/play_billing/IInAppBillingService.aidl
を自分のプロジェクトにコピーする。
$PROJECT_DIR/src/com.android.vending.billing/IInAppBillingService.aidl
AndroidStudioでは、以下の場所に変更になっている
$PROJECT_DIR/app/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl

8.
$ANDROID_SDK_ROOT/extras/google/play_billing/samples/
以下にサンプルコードがあり、ほぼそのまま使える。

$ANDROID_SDK_ROOT/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/util/*.java
を丸ごと自分のプロジェクトのsrc以下にコピー。package名だけ変える

$ANDROID_SDK_ROOT/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/MainActivity.java
を参考にしながら自分のプロジェクトのアクティビティクラスに書く。

サンプルには多くのファイルがあるが、直接使うのはIabHelper.javaだけ。
このファイルが IInAppBillingService への処理を肩代わりしている。
あとは簡単なデータ構造体として
全体的な情報(登録アイテム情報や購入済み=非消費型アイテム情報)を格納しているInventory.java,
1つの課金アイテム情報を格納しているSkuDetails.java,
1つの課金処理トランザクション情報を格納しているPurchase.javaなど。

9.
ライセンスキーをコードに記述。
base64形式で google play developer consoleに書かれているので、コピーしてコード中に記述。
サンプルコードでは、IabHelperのインスタンシエート時に必要。

10.
先ほどgoogle play developer consoleで作成した課金アイテムのプロダクトIDを適宜コードに記載。
プロダクトIDはSKUとも呼ばれる。
SkuDetails.getSku()などで取得できる。
IabHelper.queryInventoryAsync()のmoreSkusなどもこれ。

11.
適宜IabHelperを改造する。
例えば、登録している課金アイテム情報を取得する方法が無いので、
Inventory.getAllSkus() を public にしたりとか。

以上で実装は完了。引き続き動作確認に入る

12.
テストアカウントを作成。
google play developer consoleの設定→アカウント詳細に ライセンステスト という項目があり、そこにメールアドレス(google playアカウント)を記述する。これがテスト購入できるアカウントとなる。
なお、このconsole自体のgoogleアカウントはテストには使えないようになっている。デベロッパー自身が課金購入できないようになっているからだと思われる。

13.
実機端末で、先ほどのアカウントでgoogle playにログイン。
実機のgoogle playは複数アカウントでログインできるものもあるが、「その端末で最初にログインしたアカウント」でしかテスト実行ができないという記事もあった。
その場合、端末を初期化して再度テストアカウントでログインする、という大変なことになるとか。

で、ベータ公開設定画面の「オプトインURL」にアクセス。
すると、「テスターになる」ボタンがあるのでクリック。
これでテストユーザになれる。
これを忘れると、apkのベータ公開後でも「指定したアイテムは購入できません」と出てしまう。


14.
署名付きでapkを作成する
署名が無いと課金購入テストができない。
(署名無しのアプリでテストアカウントで課金購入すると、「このバージョンのアプリは、Google Playを通じたお支払いはご利用になれません。詳しくはヘルプセンターをご覧ください。」というエラーが出る。)
(また、署名つまりkey_storeが異なっていても上記のエラーが出る。そもそも署名が変わるとandroid consoleに提出できなくなる。くれぐれもkey_storeのパスワードなど忘れないように)
(また、課金テストしているバージョンと、ベータ公開しているバージョンが同一である必要がある。公開したら開発中のバージョンは上げたくなるものだが、そこはこらえて)
eclipseでプロジェクトを右クリック→Android tools→Export Signed Android Packageをクリック

なお、ここでLintまわりのエラーが起きることがある。
その場合の対処はこの記事などを参照。
「◯◯の文字列のベラルーシ語が無い」のようなローカライズ周りのエラーの場合、プロジェクト設定→Android Lint Preferences→Correctness:Messages:MissingTranslation をwarningに変更することになる。

15.
出力したapkにzipalign

16.
$adb install コマンドで実機転送

17.
動作確認。
当たり前だがネットワークが繋がっていることを確認のこと。
購入するとき、「これはテスト用の注文です。課金は発生しません。」と表示されるので安心。




その他注意点。

onIabPurchaseFinished や onConsumeFinished コールバックの引数は、
結果を表す IabResult と、アイテム情報を渡す Purchase があるが
IabResultが失敗の場合、Purchaseがnullになる。


参考
参考
参考

チェック項目一覧
参考URL https://groups.google.com/forum/#!topic/android-group-japan/hOFJKNFDCe8
---
AndroidManifestに必要な権限等を設定している。
APKには自分の証明書をセットしている(debug証明書ではない)
デベロッパーコンソールにテストアカウントのメールアドレスを登録している。
確認に使用するAPKと同じVersionCodeのAPKをデベロッパーコンソールへアップロードしている。
テストアカウントはGoogleCheckoutの設定を正しくおこなっている。
テストアカウントがプライマリアカウントとして端末に設定して稼働させている。
GooglePlayアプリで使用許諾に同意している。
署名の確認をおこなうならばアプリの公開鍵は正しいものを使用している。
---
【2015/05/20 00:50 】 | Android | 有り難いご意見(0)
[Android]バイブレーション

参考


【2015/04/10 15:35 】 | Android | 有り難いご意見(0)
[Android]システム音を鳴らす
iOSと比べると、あまりシステム音というのはない。

参考

使える音は以下
DEFAULT_ALARM_ALERT_URI
DEFAULT_NOTIFICATION_URI
DEFAULT_RINGTONE_URI



【2015/04/10 15:34 】 | Android | 有り難いご意見(0)
画像の切り取り(Android)
Androidで画像を切り取る方法。

参考

iOSと比べて面倒。
BitmapRegionDecoderというクラスを使う。
このクラスは、コンストラクタにFileインスタンスを渡して作成する。
decodeRegion()というメソッドにRectを渡すと、その範囲を切り取ったBitmapインスタンスを返す。


import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.BitmapRegionDecoder;
import android.graphics.Rect;

public Bitmap clip(String originFilePath, Rect rect)
{
FileInputStream inputStream = new FileInputStream(new File(originFilePath));

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(inputStream, true);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;

return decoder.decodeRegion(rect, options);
}





単にファイルからビットマップを作りたいときは

// filePath ... ファイルパス
File file = new File(filePath);
FileInputStream inputStream = new FileInputStream(file);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);


となる。
デコードに失敗するとnullが返ることになる。


ちなみに、アセット内の画像ファイルからビットマップを読み込む方法は

// fileName ... アセット内のファイル名
AssetManager assetManager = getResources().getAssets(); //getResources()はContextのメンバ関数。ActivityはContextなので、Activity内ならそのまま使える
InputStream inputStream = assetManager.open(fileName);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);


となる。


逆に、ビットマップをファイルに書き出すときは

// filePath ... 書き出すファイル名
// bitmap ... 書き出したい画像データ
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
bitmap.compress(CompressFormat.PNG, 80, fileOutputStream);


とする。bitmapの中身がfileに書き出される。

【2015/04/05 11:28 】 | Android | 有り難いご意見(0)
ThreadPoolExecutorで落ちたとき
ThreadPoolExecutorで実行時にハングアップしたとき

AsynkTask クラスのインスタンスのexecute()のところに不具合があった。


AsyncTask<String, Void, AccessToken> task = new AsyncTask<String, Void, AccessToken>() {
@Override
protected AccessToken doInBackground(String... params) {
........
}

@Override
protected void onPostExecute(AccessToken accessToken) {
..........
}
};
task.execute(verifier);



このverifierがnullだったのでエラーになった。
【2015/04/03 13:37 】 | Android | 有り難いご意見(0)
ProgressDialog
何かの処理中に出すようなUI。
iOSでいうとインジケータ。Windowsでいうと砂時計。


ProgressDialog
を使う。簡単

表示するとき

pd = new ProgressDialog(instance);
pd.setMessage("処理中...");
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.show();



消すとき

pd.dismiss();



これだけ。
【2015/03/31 17:22 】 | Android | 有り難いご意見(0)
Eclipseが動かない
Eclipseは起動が遅い。
起動したときに必ずSDK Content Loaderが走り、それが100%になるまでビルドその他の処理は実行できない。
そしてこれが遅い。
ネットワークが遅いとさらに遅い。

ネットワークが繋がっていても、
SDK Content Loaderが0%のまままったく進まないときがある。

そのときは、以下を参考。
参考

要するに
workspace/.metadata/.plugins/org.eclipse.core.resources/.projects
をまるごと消してしまう。
乱暴だ…。


削除してからEclipseを起動すると、プロジェクトの中身がなくなっている。
(プロジェクト名だけ残して、中身のファイルはなくなる)
Refreshコマンドを実行しても戻らない。
一度消して、再度プロジェクトの追加を行うことになる。
(File->New->Other->Android Project from Existing Code)

ライブラリプロジェクトも漏れなく消えるので、追加してBuild Projectをお忘れなく。


workspaceディレクトリ以下にあるプロジェクトは自動で復活するらしい。




あとは、adbプロセスを削除するという手もあるようだ。





【2015/03/31 16:43 】 | Android | 有り難いご意見(0)
<<前ページ | ホーム | 次ページ>>