2012年9月25日火曜日

[Android]startActivityForResultでカメラ起動後、アプリに戻ると変数の値がnullになってる現象

タイトル長くて分かりにくいですが、、

startActivityForResult でカメラ起動する
変数に値を保持。



カメラ撮影



onActivityResult でアプリに戻ってくる
変数の値がnullになっている



のような現象が発生しました。

スマートフォンで発生せず、タブレットで発生。
・スマートフォン(SC-04D、ISW11HT)
・タブレット(SC-01D)



ソース1:カメラ起動する


ContentValues values = new ContentValues();
   values.put(MediaStore.Images.Media.TITLE, filename);
   values.put(MediaStore.Images.Media.MIME_TYPE, Const.MIMETYPE_PNG);
   mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
 
   // カメラ起動
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(intent, Const.REQUEST_CODE_CAMERA);

mImageUriにカメラ撮影したデータを保存するもらう。


ソース2:カメラからの戻り処理

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(resultCode == RESULT_OK) {
Intent intent;
// カメラからの戻り処理
if(requestCode == Const.REQUEST_CODE_CAMERA){
Log.d(tag, mImageUri);
}
}
}
カメラから戻ったら、mImageUriをログ出力。




[原因]

タブレットを傾けていたのが、よろしくなかった模様。

カメラ起動元の画面はマニフェストで縦固定の指定をしていた。
android:screenOrientation="portrait"

カメラ起動後、縦⇔横回転が行われていたようで、
アプリに戻ってきたときに横 → 縦の処理が行われ、画面の再作成した。(と思う)
ここで変数が初期化されてしまった。


[対策]
マニフェストに以下を記述。
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|fontScale"

端末回転しても画面破棄しないようにする。
(orientationだけでいいんだけど、全部指定してみた)



2012年9月19日水曜日

[Android]動くジョジョ風ランチャーウィジェット2をリリースしました

動くジョジョ風ランチャーウィジェット2をリリースしました。
1とは別アプリとして動作します。

1ではなかったユーザーさんが好きな文字を入力できる機能を実装。

こんな風に文字入力できます。



ウィジェットとして設定するとこんな感じです。


お試しあれ。

https://play.google.com/store/apps/details?id=com.gettingsignals.android.JoJoLauncher2

2012年9月12日水曜日

[Android]アプリ内課金の銀行口座にデポジットされない問題→解決

Androidでアプリ内課金機能を実装する場合、
売り上げを入金してもらうための銀行口座が必要になります。

Google checkout から「設定」-「財務情報」から銀行口座を入力するわけですが、
https://checkout.google.com/sell/

Googleさんからテストデポジットがされなかったときの対処方法です。


私の使ったのは楽天銀行さんです。

銀行口座に以下の情報を入力します。
タイプ:Futsuu
銀行名:Rakuten Bank
口座名義:半角カタカナ(姓名の間スペース、小文字は大文字に)。※ローマ字ではない
銀行コード:0036
口座番号:xxxxxxx
支店番号:zzz


初めに登録したとき、
1ヶ月経ってもデポジットされず、デポジット失敗のメールも来なかったので、
サポートセンターから問い合わせしました。(英語のみ)

http://support.google.com/checkout/sell/bin/request.py?contact_type=payouts&from=vba

フォーム入力して、Submit押すと数日後にメール来ます。
※Submit押しても受付完了メールとか来なくて、何回もしてしまった。。


口座名義のところをローマ字で入力してしまってたので、修正したい旨を連絡。
銀行名も間違ってた。Rakuten KC にしてたorz
※カード見ながら入力するとこうなる


正しく入力し直して、1週間経過。

以前、Adsenseのデポジットされていたので、試しに入力するもNG。
3回やってアカウントロック。しまった!

もう一度問い合わせ。
・一週間経ってもデポジットされない。
・アカウントロックされちゃった。

Google「今日デポジットしたよー」

翌日にデポジット確認。



勉強になったこと。
・Adsenseのデポジットとは別。
・入力するときはここも参照。
http://support.google.com/adsense/bin/answer.py?hl=ja&answer=1316748#n4
・デポジットは1週間は待ってみること。
・デポジット失敗してもメールは来ない?
・なんでデポジットされなかったのかの原因は不明。


Adsense と違って、checkoutは銀行口座が認証されないと変更できないので注意

2012年9月7日金曜日

[Android]広告(adstir)をFragment化してみた

nendさんに続いて、お次はAdStirさんです。
http://ja.ad-stir.com/

AdStirさんは複数の広告ネットワークを自動で配分してくれます。


Android 2.xでも使えるように、Android Support Package v4使ってます。

libsフォルダadstir.jar を追加し、ビルドバスに追加


AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
 ・・・・>
   <meta-data android:name="ADSTIR_APP_ID" android:value="MEDIA-xxxxxxx" />
</application>



main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<fragment
  android:id="@+id/fragmentAd"
   android:name="com.package.Sample.AdstirFragment"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   />
</RelativeLayout>



AdstirFragment.java
public class AdstirFragment extends Fragment {  
AdstirView adView;
public AdstirFragment() {
}
    
    @Override  
    public View onCreateView(LayoutInflater inflater,  
            ViewGroup container, Bundle savedInstanceState) {  
        
    adView = new AdstirView(getActivity(), 1);
return adView;
    }
    
    @Override
    public void onResume() {
   super.onResume();
   adView.start();
}
 
@Override
public void onPause() {
   super.onPause();
   adView.stop();
}


    @Override
    public void onDestroy() {
        super.onDestroy();
        new AdstirTerminate(getActivity());
    }
}

onResume() / onPause() でstart / stop の処理が必要。
これでいいのかな、Fragment使いこなすにはもう少しかかりそう。

[Android]広告(nend)をFragment化してみた

とあるアプリをタブレット対応したので、ついでに広告処理もFragment実装してみました。

使用したアドネットワークは、nendさん。
https://www.nend.net/


libsフォルダにnendSDK-1.2.1.jarを格納し、ビルドパスに追加

AndroidManifest.xml

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
追記。


main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" >
<fragment
  android:id="@+id/fragmentAd"
   android:name="com.sample.package.NendFragment"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   />
</RelativeLayout>



NendFragment.java
public class NendFragment extends Fragment implements NendAdListener {  
private static final int SPOT_ID = ****** 発行されたSPOT ID ******;
private static final String API_KEY = "******** 発行されたAPI KEY *********";
public NendFragment() {
}
    
    @Override  
    public View onCreateView(LayoutInflater inflater,  
            ViewGroup container, Bundle savedInstanceState) {  
        
    NendAdView adView = new NendAdView(getActivity().getApplicationContext(), SPOT_ID, API_KEY);
    adView.setListener(this);
return adView;
    }

@Override
public void onFailedToReceiveAd(NendAdView arg0) {
}

@Override
public void onReceiveAd(NendAdView arg0) {
}
}


Fragment化しておけば、レイアウトファイルに追加するだけでいいから便利ですねー。