2012年12月27日木曜日

Activityの引数(setResult, onActivityResult)

簡単なActivity遷移を記述してみましょう。

画面を立ち上げて、
ボタンを押下するとsub画面が立ち上がるアプリです。

サブ画面でアプリの戻るボタンを押すと、
サブ画面が終了して、メイン画面に戻る仕様です。


■メインアクティビティ

package com.example.finishactivity;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{

    private int iNo = 1;
    private final int iMAIN = 0;
    private final int iSUB  = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Toast.makeText(getApplicationContext(), "初期呼び出し", Toast.LENGTH_SHORT).show();
        
  //ボタンの作成
  Button button = new Button(getApplication());
        //ボタンに表示される文字列を設定
  button.setText("サブ画面呼び出し");
        //ボタンにIDを設定
  button.setId(iSUB);
  button.setOnClickListener(this);
        addContentView(button, new LinearLayout.LayoutParams( 350,70));
    }

    public void onClick(View view){
        //どのボタンを押すかの判定
        switch(view.getId()){
            case iSUB:
                Intent intent = new Intent(this, SubActivity.class);
                //Activityに引数を渡す
                intent.putExtra("count", String.valueOf(iNo));
                iNo += 1;
                //Activityを開始。iMAINで呼び出し元のActivityを判断できるようにする
                startActivityForResult(intent, iMAIN);
              break;
           default:
               break;
        }
    }

    
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //LOGで引数が返ってきているかを確認しよう
        Log.d("onActivityResule","requestCode:" + requestCode + " resultCode:" + resultCode);
        
        //requestCodeでそのActivityを呼び出したActivityを判断
        if (requestCode == iMAIN){
            //resultCodeで呼び出し先からのActivityの引数を取得
            if (resultCode == RESULT_OK){
                Toast.makeText(getApplicationContext(), "「サブ画面から戻ったよ」のお知らせ", Toast.LENGTH_SHORT).show();
            }
        }
    }
}


■呼び出しされるActivity

package com.example.finishactivity;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.KeyEvent;
import android.widget.LinearLayout;
import android.widget.TextView;


public class SubActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // テキストビューの生成
        TextView textView = new TextView(getApplication());

        //呼び出し元の引数の取得
        Intent i = getIntent();
        //Key(count)から、Itemを取得
        String keyword = i.getStringExtra("count");

        textView.setText(keyword + "回目");
        addContentView(textView, new LinearLayout.LayoutParams( 100,70));
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // BackBtnアクション
        if(keyCode==KeyEvent.KEYCODE_BACK){
            //戻るActivity先に引数を渡す
            setResult(RESULT_OK);
            //Activityの終了
            this.finish();
            return true;
        }
        return false;
    }
    
}


■マニフェストファイル
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.finishactivity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.finishactivity.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.finishactivity.SubActivity"
            android:label="@string/app_name" >
        </activity>
</application>

</manifest>


こんな感じです。

実行すると

■初期画面
 ■ボタン押下後
 ■戻るボタン押下後
 ■この処理を繰り返すと




基本的なActivityの動かし方でした。



//Activityに引数を渡す
intent.putExtra("count", String.valueOf(iNo));

こちらの処理で呼び出し元のActivityから、新しい
Activityに引数を渡しています。

Intent i = getIntent();
String keyword = i.getStringExtra("count");

こちらで、先ほど渡した引数を取得しています。


また、
setResult(RESULT_OK);
で、呼び出し先のActivityから、呼び出し元の
Activityに引数を渡しています。

呼び出し先の処理が成功したら1
呼び出し先の処理が失敗したら0

を返す様な形にすると、呼び出し元のActivityに
戻った時に処理結果を取得できます。


2012年12月24日月曜日

Activityを呼ぶ(intent, startActivity)

今回は今いるActivityから、他のActivityを呼ぶ方法を紹介します。

簡単に書くと

intent i = new Intent(this, パッケージ名.クラス名);
startActivity(i);

上記のように実装すると、新たな画面を呼ぶことができます。
ただ、上記の方法だと新しい画面に引数を渡していません。。

引数を使いたい人は

intent i = new Intent(this, パッケージ名.クラス名);
intent.putExtra("キーとなる文字列", "渡したい値");
startActivity(i);

こんな感じで完成です。
特に難しいことはないので、ご安心を。

intent.putExtraは何個でも作れます。


また、


startActivityForResult(intent, 呼び出し元のキーとなる数値);


を使うと、
呼び出し先のActivityが終了したときに、

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

    }

にコールバックされます。

詳細は次回にでも。


↓にそれっぽいのを書いておきます。


例)

メインのActivityのボタンを押したら、
次の画面に遷移する。


package com.example.finishactivity;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{


    private final int iMAIN   = 0;
    private final int iSUB    = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //画面を表示
        setContentView(R.layout.main);
        
        // ボタンの作成
Button button = new Button(getApplication());
button.setText("サブ画面呼び出し");
        //ボタンのID
button.setId(iSUB);
button.setOnClickListener(this);
        //ボタンを画面に追加
addContentView(button, new LinearLayout.LayoutParams( 350,70));

    }

    //クリックした時に呼ばれる
    public void onClick(View view){
        //どのIDのボタンをクリックしたかの判定
        switch(view.getId()){
           case iSUB:
            //開く画面のクラスをインテント
            Intent intent = new Intent(this, SubActivity.class);      
            //引数の作成
            intent.putExtra("count", String.valueOf(iNo));
            iNo += 1;
            //引数を渡して、画面を呼ぶ
            startActivityForResult(intent, iMAIN);
    break;
    default:
    break;
   
    }
    }
}



どうですか?

動きました??

動かない人は
SubActivityを作ってください。
普段のActivityと同じもので大丈夫です。




それでも。うごかない人いますか?
startActivityForResultで止まってしまう人。

その方は

<activity
  android:name="com.example.finishactivity.SubActivity"
    android:label="サブ画面" >
</activity>

をmanifest.xmlに追記してください。

メインアクティビティの </activity>の下にでも追記してください。


以上で、Activityの呼び方は終了です。





おまけとして、


起動と同じくらい大事なのが
終了処理です。

終了処理について、少しだけ触れたページを以前作成致しました。

内容としては

finish();はいいよ。
っていうことでしたね

「内容うっすい」

とみなさん思われたでしょう。

私もそう思います。



本当はいろいろ、紹介したかったのですがね。。。、



まぁ、何であまり細かく書かなかったかというと、
処理の終了という概念が難しいからです。

完全に処理を終わらせるのか?
タスマネに出現しない状態にすればいいのか?
ユーザー目線での処理終了なのか?

なので、一番無難な
finish();
だけにしました。

画面が増えれば増えるほど、
Activityの管理は難しくなります。
また、そのアプリに課金、PUSH通知を実装していれば、
やはり、アプリの終了の仕方が変わります。

まぁ、用はいろいろだということです。

いろいろあるんですけれども、
Androidアプリで、Activtyの管理はとても大切です。

自分のアプリで最適なActivotyを是非見つけてください。

2012年12月21日金曜日

終了処理(finish)

アプリを終了させる方法として、

finish();

があります。

this.finish();

使い方は上記な感じで。。。


現在のActivityが終了となります。

戻るボタンを押すと作動する仕組みにするのが、
お勧めです。
「終了しますか?」見たいなダイアログを出すのもいいですね。

■サンプル
バックボタンを押すとアクティビティーを終了させます。



@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // BackBtnアクション
    if(keyCode==KeyEvent.KEYCODE_BACK){
         finish():
    }
}


他にもアプリを終了させる方法はありますが、

System.exit();
android.os.Process.killProcess(android.os.Process.myPid());
moveTaskToBack (bolean);


等ありますが、

System.exit()はActivityのライフサイクルを無視した強引な終了方法。
android.os.Process.killProcess(android.os.Process.myPid());はプロセスを直接終了させるパワープレイ。
moveTaskToBack は一応推奨されているらしいです。

finish();
の代わりにいろいろと試してみてください。



個人的にはいろいろな端末で検証した結果、finish()が一番よさそうでした。





2012年12月17日月曜日

バイブ機能(Vibrator)

今回はアプリ制作時に地味に大切なバイブ機能について記します。

と、その前に。。


自分の作るアプリにバイブ機能は関係ない
と思っていませんか?

「振動プルプルしてUZA」
「ゲーム作っている訳ぢゃないから、バイブなんていらNE-YO」
などなど

まぁまぁ。。。
おさえておさえて


とりあえず記載すると。


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

<uses-permission android:name="android.permission.VIBRATE"/>

メインソース

package com.example.vibtest;

import android.os.Bundle;
import android.os.Vibrator;
import android.app.Activity;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Vibratorインスタンス取得
    Vibrator vib = (Vibrator)getSystemService(VIBRATOR_SERVICE);

    //100ミリ秒の振動
    vib.vibrate(100);
 
  //こんな使い方も
    long[] pattern = {50, 100, 500, 1000, 10, 500};  

    //50ミリ秒後に100ミリ秒の振動。500ミリ秒休憩して1000ミリ秒の振動。10ミリ秒休憩の500ミリ秒の振動
    vibrator.vibrate(pattern, -1);

    }
}

このような感じで使います。

第1引数に、振動させたい時間をミリ秒で指定します。

引数が2つの場合には、振動パターンを格納した配列を第1引数に
配列内の振動を繰り返す場合には第2引数を0、一度きりなら、-1

バイブを止める時は

vib.cancel();


結構、簡単に組み込めます。



そして、

話を戻して
なぜ、バイブが大事か?

ユーザーのタッチイベントが成功したことをユーザー
通知するために大事です。

意味わからない日本語になってしまいましたが。。。。

言い換えると、

ユーザーが画面をタッチしたときに、
ちゃんと押せているか不安になるのを
解消するためにバイブで軽く震わせます。

これで、ユーザーはボタンをしっかり押せたことを
認知して、ボタンを連打したり、無闇に画面遷移しなくなるでしょう。

想定外の操作をされると、サポート大変ですもんね。


Toastで簡単にデバッグ


実機を使ったデバッグ作業の際に
便利なのが

Toast

Activityをextendしているなら、簡単に使えるので、
使い方を覚えておくとものすごく便利です。



package com.example.adaptertest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //メイン画面の表示
  setContentView(R.layout.main);
  Toast.makeText(getApplication(), "Hell World!!", Toast.LENGTH_SHORT).show();
    }
}



これだけなんですが。。。。

Toast.makeText(getApplication(), "Hell World!!", Toast.LENGTH_SHORT).show();

出現時間を延ばしたいなら、Toast.LENGTH_SHORTをToast.LENGTH_LONGで。
数字で指定することもできるので、3で3秒表示。。。

Toast.makeText(getApplication(), "Hell World!!", 3).show();


Logの確認ができない端末や企画の方に見せる時などに、
結構便利です。

しかも、結構、どんな状況でもActivityが落ちることなく
出現してくれます。何でか理由はわかりませんが。。。

関係ない話ですが、
トースト見たいにパーンって、出現するから、
Toastって言うんですかね??

しかも、イメージは食パンですね。

画像が表示されない。OPENGL


エミュレータだと画像が表示されるのに、実機だと画像が表示されない!!

そんな、問題にぶつかったことありませんか??

実機で画像を見ると、画像が真っ白!!

その原因はですね、


画像サイズです。

OPENGLを使って、画像を描画する際には
画像サイズを2のべき乗にしないといけません。

単位はピクセルで
2
4
8
16
32
64
128
256
512
1024


なので、
1024×512とか
32×32などなど。。。。。
が使えるサイズです。


結構、制限があり面倒なのですが。。
しょうがないですよね。

「こんなことしなくても、大丈夫だよ!!」
という情報をお持ちの方は是非よろしくお願いいたします。

2012年12月6日木曜日

Google Play以外のマーケット


GooglePlayから、保留にされたアプリや
GooglePlayでは公開できないアプリ

等々、お持ちではないでしょうか?

今回はそんな方々のために、
GooglePlay以外にアプリを公開できるサイトを
紹介いたします。

他にもお勧めのサイトがある!!
という方はお手数ですが、ご連絡のほど
よろしくお願いいたします。




Opera Mobile Store

ホーム
http://apps.opera.com/ja_jp/

デベロッパー登録
http://apps.opera.com/ja_jp/developers.php

ブラウザで有名なオペラのマーケットです。
■メリット
デベロッパー登録無料!!
アプリ審査なし!!
GooglePlayのスクリーンショットがそのまま使える!!

■デメリット
集客力が悪い
アプリダウンロード数が信用できない!!
ユーザー統計が乏しい
日本語対応しているが、日本向けではない

集客力がないのが何よりものデメリットですが、
オペラのブランドが魅力的です。
登録から公開まで手軽にできるので、
軽い気持ちで覗いてみてください。



Tapnow

ホーム
http://www.tapnow.jp/

デベロッパー登録
http://www.tapnow.jp/developer/index.html

日本人用のマーケットです。
■メリット
デベロッパー登録無料!!
アプリ審査なし!!
GooglePlayのスクリーンショットがそのまま使える!!
日本人向けのアプリも大丈夫!!

■デメリット
集客力が悪い。オペラよりも全然悪い
日本にしか、販売できない
ユーザー統計が乏しい
公開したアプリがリジェクションされる事がある


こちらも集客力がまったくないサイトですが、
日本語バリバリのアプリも公開できるのが魅力的です。
ただ、デメリットにも記載しましたが、アプリがリジェクションされることが
ありますので、レギュレーションはしっかり守りましょう!!さすが、日本人!!




SamSung

ホーム
http://www.samsungapps.com

デベロッパー登録
http://seller.samsungapps.com

■メリット
デベロッパー登録無料!!
集客力あり!!
日本向けのアプリでも世界向けでも大丈夫!!

■デメリット
1週間ほどの審査あり
Googleよりも審査が厳しい?!
Sumsungの端末しか、ダウンロードできない!!
デベロッパーページが重い

こちらはSamSung専用のサイトですが、
集客力はかなりあるサイトです。
GooglePlayとユーザー層が異なるので、
下手すると、GoolePlayよりインストールされることもあります。
ただ、審査が厳しく、審査機関も長いです。
イメージとしてはアップルを想像してくださればOK!!
審査に落ちても、とても丁寧に修正箇所を教えて
くれるので、問題ありません。




Amazon

デベロッパー登録
https://developer.amazon.com/welcome.html

■メリット
デベロッパー登録無料!!
集客力あり!!
SamSungよりも、審査は緩い
日本向けのアプリでも世界向けでも大丈夫!!

■デメリット
審査あり。Sumsungほど、厳しくはない。
統計情報が調べにくい
デベロッパーページが重い

こちらも最近は集客力のあるサイトです。笑
審査はSamSungよりも緩めで、審査で何を調べているか
よくわかりません。。
日本版のマーケットも開けたことで、現在最も
注目しているマーケットでもあります。
Amazonのインタレストマッチングの機能を生かして、
マーケットが発展していくことを切に願っています。




★まとめ
個人的におすすめはAmazonとSumSungです。
アプリによっては、GooglePlayよりもインストール数が飛躍的に伸びます。
ただ、GooglePlayのランキング上位というのは、Androidアプリ界では
どんな広告にも負けない最強の集客力を持っています。
集客が分散することのメリット・デメリットを考えて、いろいろなマーケットを
見てみましょう!!

Android 4 が使えない!!


ある日、社内で「アプリが使えない!!」と報告を受けました。
いやいや、もうリリース済だし、
バグ報告ないし、
てか何の機能が使えないの?

その説明だけでは、何が悪いかわからない
もっと詳細を伝えてよぉ。
と上から目線で愚痴りながら、
問題の端末を試したところ。


ご報告通りでした。
まったく、画面が表示されていません


原因は何?
端末依存?
まぁ、いろいろと疑う点はあるが、
とりあえず調査!!

。。。


調査の結果、Android4以降の端末で
画面が表示されていないことが判明!!

結構、影響範囲が広い!!


問題の個所や対応方法をいろいろと調べたが見つからない!!
偉い人にバレる前に問題解決しなければ

。。。。


原因はmanifest.xmlの指定
↓のように指定したら、解決
<uses-sdk android:minSdkVersion="7" />


今まで、8だったのが使えなく、7にすると、
Android4以降でも使えました。

腑に落ちないのですが、
調べるのも面倒なので、一旦終了!!


もし、同じような事象で困っていましたら、
一度、android:minSdkVersionの設定を
いじってみるといいかもしれませんね。

2012年12月4日火曜日

Google Map を使ってみよう!!(02)

Google APIキーを取得したら、いよいよ組込みです。


まずは、extendsをActivityから、MapActivityniに変更いたします。


import com.google.android.maps.MapActivity;

extends MapActivity implements LocationListener


importを失敗してしまう方は、

【対象のプロジェクトを右クリック】→【ビルド・パス】→【ビルド・パスの構成】→【Android】→【Google APIs】にチェック



*Google APIsが表示されない方は【ウィンドウ】→【Android SDK マネージャー】からインストールをお願いいたします。

package com.test.googlemaps;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.MapController;

//位置情報の取得
public class MainActivity extends MapActivity implements LocationListener {

    //Mapビュー
    private MapView         mMapView;
    //Mapコントローラ
    private MapController   mMapCtrl;
    //ロケーションマネージャ
    private LocationManager mLm;     
    //(1)で作成したAPIKEY
    private final static String sAPI_KEY= "";
    
    //アクティビティ起動時に呼ばれる
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
//-------------------------------------------
//①
        //Mapビューの生成
        mMapView = new MapView(this, sAPI_KEY);
        setContentView(mMapView);
        // MapViewをコントロールするためのオブジェクト取得
        mMapCtrl = mMapView.getController();
        // 地図の縮尺設定
        mMapCtrl.setZoom(16);
//-------------------------------------------
    }

    //アクティビティ開始時に呼ばれる
    @Override
    public void onStart() {
        super.onStart();
//-------------------------------------------
//②
        //ロケーションマネージャの設定
        mLm= (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        mLm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
//-------------------------------------------
    }

    //アクティビティ停止時に呼ばれる
    @Override
    public void onStop() {
        super.onStop();
        //ロケーションマネージャーの設定
        mLm.removeUpdates(this);

    }
    
    //ルート表示するかどうか
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    //位置情報変更のイベント処理
    public void onLocationChanged(Location location) {
//-------------------------------------------
//③
        //緯度と経度の取得
    int iIdo = (int)(location.getLatitude() * 1E6);
    int iKeido = (int)(location.getLongitude() * 1E6);
        GeoPoint pos=new GeoPoint(iIdo, iKeido);
        mMapCtrl.setCenter(pos);
        Toast.makeText(getApplication(), "経度:" +String.valueOf(iKeido) + ", 緯度:" + String.valueOf(iIdo), Toast.LENGTH_LONG).show();

//-------------------------------------------
   }

}

ざっと書くとこんな感じです。

//-------------------------------------------
//①

mMapCtrl.setZoomで縮尺レベルを設定しています。
今回は「16」です。

//-------------------------------------------

//-------------------------------------------
//②
LocationManagerのrequestLocationUpdatesで現在いる場所を
取得しています。

mLm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 20*1000, 0, this);
上記のように書くと、5000ミリ秒(20秒)毎に更新をおこなうようになります。

requestLocationUpdates(プロバイダ、更新時間、更新距離、ロケーション)

requestLocationUpdatesはGoogle Mapを使う際に結構大事なところなので、
処理を押さえておくといいかと思います。

//-------------------------------------------

//-------------------------------------------
//③
Locationのオブジェクトからは、緯度経度の取得をして、
mMapCtrl.setCenterで今いる場所を地図の真ん中に
表示するよう設定しています・

緯度経度取得時の * 1E6 は見慣れた緯度経度と同じ単位にするために
10万倍(1E6倍)しております。
//-------------------------------------------


最後にmanifest.xmlの記載

ライブラリの使用

        <uses-library android:name="com.google.android.maps"/>

ユーザーへの許可

    <uses-permission android:name="android.permission.INTERNET"/>

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

<uses-library>タグは<application>タグ内の好きなところで
<uses-permission>は<application>の外で記載してくださいね。


2012年12月3日月曜日

Google Map を使ってみよう!!(01)


Google APIを使って、Google MapをAndroidアプリに組みます。
とりあず、ソースの組み込み自体は簡単ですが、下準備が面倒なので、
心して取り掛かりましょう!!

Google APIはこちら  (とりあえず画面をみるだけ)
https://developers.google.com/android/maps-api-signup

で、先ほどのページで、何をするかというと、
Google APIを使うためのMaps API keyを作成致します。

そして、Maps API keyを作成するのに証明鍵
のフィンガープリントの準備をこれから行います。

証明鍵??
フィンガープリント??

証明鍵とは、アンドロイドアプリのソースをビルドする時に
用いる鍵のこと。

証明鍵をお持ちの方----------------------------------------------------------

コマンドプロンプト
keytool -list -v -keystore キーストアー -storepass パスワード
出力結果のフィンガープリントの内容(MD5:)をメモ

キーストアーは.keystoreのファイルです。
上手くいかない場合にはCDでkeystoreのあるフォルダ直下
にするとうまくいったり、いかなかったりと

---------------------------------------------------------------------------

証明鍵をお持ちでないかた-----------------------------------------------------

cd "C:Program Files\Java\jdk1.6.0_29\bin"
keytool.exe -list -keystore ' C:\Users\(ユーザ名)\.android\debug.keystore
キーストアのパスワードを入力してください:(エンターキーのみ押下)コマンドプロンプト

出力結果のフィンガープリントの内容(MD5:)をメモ

---------------------------------------------------------------------------

いづれにしても、プロンプトの出力結果の
証明書のフィンガープリントをメモしなければいけません。

そして、再度
https://developers.google.com/android/maps-api-signup

のページに行きます。

agreeして。

My certificate's MD5 fingerprint:

この右側の空欄に先ほど、メモしたフィンガープリントを入力!!
間違えないように気を付けてください。

そして、Generate API Keyボタンを
押すと、うまくいけばAPI KEYがGenerateされています。
失敗すると、戻るボタンを押して再入力

この画面で私は小一時間くらい、時間を潰してしまいましたぁ。

プロンプトの出力結果をコピれればいいんですけど。。
誰かやり方知っていますか??


とりあえず、Maps API keyをコピーして、下準備は完了です。

これで、ようやくソースの組み込みに取り掛かれます。

2012年12月2日日曜日

不明なエラー: Unable to build: the file dx.jar was not loaded from the SDK folder!

不明なエラー: Unable to build: the file dx.jar was not loaded from the SDK folder!

このようなエラーがでて、ビルドができなくなってしまった。。。


【プロジェクト】→【クリーン】

を実行しても、Eclopseの再起動しても、ダメだぁ!!


うん。。

悩むこと1時間。いや、2時間


システムの環境変数を確認したところ、Android-SDKのpathの設定が変更されていた!!

とりあえず、再設定しなおしたら、ビルド成功!!

なんで、pathの設定が変更されていたか、気になるけど
今回はとりあえず、これで問題解決です。