[Android] 2010年未公開記事

| トラックバック(0) |

blog.PNG

いくつかの記事が下書きのままに未公開になってしまいましたので、その一部をトピックのみ報告させていただきます^^;

 

第2回 SHARPハッカソン@東広島に参加しました(2010/12/18-19)

SHARP 工場で開催された「第2回 SHARPハッカソン」に参加させていただきました。

当チームは、SHARP 製端末の歩計計 API を使用し、ダイエット IME である「歩meji」を開発、惜しくも 2 位という結果でしたが、

しかじろうさん、しげむらさん、あかいさん、SHARP の皆様と楽しく開発させていただきました。

交通費・懇親会・宿泊費・景品もろもろすべて準備していただいた SHARP さん、ブリリアントサービスさんに改めまして感謝です。

 

日本 Android の会 金沢支部勉強会に参加しました(2010/10/23, 3/13)

近場の勉強会が少ないということもあって、車で往復8時間かけて金沢まで遠征しました。

きんねこ さんをはじめ、多くの金沢クラスタの方々と楽しい時間を共有させていただきました。ありがとうございました。

 

長野でお蕎麦・温泉(2010/夏)

日本 Android の会の たじてるさん、(セカイカメ○の)わたなべさん、(ミ○のライブ壁紙の)ひょろもさん、○○さんを招き、

大都会の蕎麦と温泉を楽しみました。わざわざ遠方より駆けつけて頂き、ありがとうございました。大変楽しかったです。

 

Android 開発 最新動向レポート2010(2010/5/10)

「Google Android入門 ~携帯電話開発の新技術(技術評論社,2008)」の著者でもある嶋さんより お声をかけて頂き、

日本 Android の会の著名な方と共著で「Android開発 最新動向レポート2010」を執筆させていただきました。

貴重な体験をさせていただき、ありがとうございました。

※2010年とありますが、2010年5月発売(済)で、2010年3月くらいまでの内容となっていますので、ご注意ください

 

モテバッジ(Simeji バッジ2009年冬モデル?)を入手(2010/1/1)

Twitter ドリブン開発(TDD)による wimeji のご褒美?ということで、

Simeji の作者である adamrocker さんから Simeji バッジを頂きました。

(しかも、送料負担でわざわざ自宅宛に送付してくださった。)

ありがとうございました(あれっ、去年の元旦の話だry...)。

 

レビューできなかった雑誌・書籍たち

以前は、こまめにレビュー記事を書いていたのですが、

以下のものは購入したもののレビューが追いつかず、下書きのままになってしまいました^^;

いづれもお勧め良書ですので、書店で見かけたら手にとってみてください。

 

adakoda ブログ

pageview.PNG

サイトの年間のページビュー(2010年のみ)は、約160万PV でした。

しかしながら、書いた記事数は、245(2009年) → 108(2010年)に半減するなど、すっかり更新の頻度が下がってしまいました。

※特に後半は、「Y.A.M の 雑記帳」「Android(アンドロイド)情報-ブリリアントサービス」、他多数の良サイトの勢いに圧倒されてry...

 

2011 年もマイペースで更新しようと思いますので、よろしくお願いいたします^^;

はてな認証(OAuth) API が Hatena Developer Center で公開されていました(2010/12/13)。

 

これにより、「はてなログイン管理」アプリケーションがインストールされていない環境でも、

同APIに対応することで、単独のアプリケーションで「はてな認証」が可能となります。

早速、Android から呼び出してみた感じでは、Twitter などと同様の手順で OAuth を使用することができました。

 

以下、OAuth 認証の部分を独立したアクティビティとして実装しているので、

呼び出し側インテントの値を変更することで、はてな以外のサービスにも利用できます。

oauth-signpost を使用しています

※CONSUMER_KEY、CONSUMER_SECRET、CALLBACK(httpではじめてください)を書き換えてください

hatena_oauth1.png hatena_oauth2.png

hatena_oauth3.png hatena_oauth4.png 

 

サンプルコード

  • 呼び出し側サンプル(OAuthActivity.java 利用例)

private static final int REQUEST_OAUTH = 1;

private static final String REQUEST_TOKEN_ENDPOINT_URL = 
    "https://www.hatena.com/oauth/initiate";
private static final String ACCESS_TOKEN_ENDPOINT_URL = 
    "https://www.hatena.com/oauth/token";
private static final String AUTHORIZATION_WEBSITE_URL = 
    "https://www.hatena.ne.jp/touch/oauth/authorize";
private static final String CONSUMER_KEY = "XXXXXXXXXXXXXXXX";
private static final String CONSUMER_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
private static final String CALLBACK = 
    "http://www.adakoda.com/android/hatenaoauthsample/callback";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = new Intent(this, OAuthActivity.class);
    intent.putExtra(OAuthActivity.REQUEST_TOKEN_ENDPOINT_URL, REQUEST_TOKEN_ENDPOINT_URL);
    intent.putExtra(OAuthActivity.ACCESS_TOKEN_ENDPOINT_URL, ACCESS_TOKEN_ENDPOINT_URL);
    intent.putExtra(OAuthActivity.AUTHORIZATION_WEBSITE_URL, AUTHORIZATION_WEBSITE_URL);
    intent.putExtra(OAuthActivity.CONSUMER_KEY, CONSUMER_KEY);
    intent.putExtra(OAuthActivity.CONSUMER_SECRET, CONSUMER_SECRET);
    intent.putExtra(OAuthActivity.CALLBACK, CALLBACK);
    startActivityForResult(intent, REQUEST_OAUTH);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case REQUEST_OAUTH:
        if (resultCode == Activity.RESULT_OK) {
            String token = data.getStringExtra(OAuthActivity.TOKEN);
            String tokenSecret = data.getStringExtra(OAuthActivity.TOKEN_SECRET);
            new AlertDialog.Builder(this)
                .setMessage("[TOKEN]\n" + token + "\n" +
                        "\n[TOKEN SECRET]\n" + tokenSecret)
                .create()
                .show();
        }
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

 

  • AndroidManifest.xml

<activity android:name=".OAuthActivity"
    android:configChanges="orientation|keyboardHidden" />

 

  • 本体コード(OAuthActivity.java)

package com.adakoda.android.hatenaoauthsample;

import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.exception.OAuthNotAuthorizedException;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class OAuthActivity extends Activity {

    public static final String REQUEST_TOKEN_ENDPOINT_URL = "request_token_endpoint_url";
    public static final String ACCESS_TOKEN_ENDPOINT_URL = "access_token_endpoint_url";
    public static final String AUTHORIZATION_WEBSITE_URL = "authorization_website_url";
    public static final String CONSUMER_KEY = "consumer_key";
    public static final String CONSUMER_SECRET = "consumer_secret";
    public static final String CALLBACK = "callback";
    public static final String TOKEN = "token";
    public static final String TOKEN_SECRET = "token_secret";
    private static final String OAUTH_VERIFIER = "oauth_verifier";

    private String mRequestTokenEndpointUrl;
    private String mAccessTokenEndpointUrl;
    private String mAuthorizationWebsiteUrl;
    private String mConsumerKey;
    private String mConsumerSecret;
    private String mCallback;
    private String mOAuthVerifier;
    private CommonsHttpOAuthProvider mOAuthProvider;
    private CommonsHttpOAuthConsumer mOAuthConsumer;

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_PROGRESS);
        Intent intent = getIntent();
        mRequestTokenEndpointUrl = intent.getStringExtra(REQUEST_TOKEN_ENDPOINT_URL);
        mAccessTokenEndpointUrl = intent.getStringExtra(ACCESS_TOKEN_ENDPOINT_URL);
        mAuthorizationWebsiteUrl = intent.getStringExtra(AUTHORIZATION_WEBSITE_URL);
        mConsumerKey = intent.getStringExtra(CONSUMER_KEY);
        mConsumerSecret = intent.getStringExtra(CONSUMER_SECRET);
        mCallback = intent.getStringExtra(CALLBACK);
        if (((mRequestTokenEndpointUrl != null) && (mRequestTokenEndpointUrl.length() > 0)) && 
             ((mAccessTokenEndpointUrl != null) && (mAccessTokenEndpointUrl.length() > 0)) &&
             ((mAuthorizationWebsiteUrl != null) && (mAuthorizationWebsiteUrl.length() > 0)) &&
             ((mConsumerKey != null) && (mConsumerKey.length() > 0)) &&
             ((mConsumerSecret != null) && (mConsumerSecret.length() > 0)) &&
             ((mCallback != null) && (mCallback.length() > 0))) {
            mWebView = new WebView(this);
            mWebView.clearCache(true);
            mWebView.setWebViewClient(mWebViewClient);
            mWebView.setWebChromeClient(mWebChromeClient);
            WebSettings webSettings = mWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setBuiltInZoomControls(true);
            setContentView(mWebView);
            new Thread(mStart).start();
        } else {
            finish();
        }
    }

    private WebViewClient mWebViewClient = new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            if ((url != null) && (url.startsWith(mCallback))) {
                mWebView.stopLoading();
                mWebView.setVisibility(View.INVISIBLE);
                if (mOAuthVerifier == null) {
                    Uri uri = Uri.parse(url);
                    mOAuthVerifier = uri.getQueryParameter(OAUTH_VERIFIER);
                    if (mOAuthVerifier != null) {
                        new Thread(mEnd).start();
                    } else {
                        finish();
                    }
                }
            } else {
                super.onPageStarted(view, url, favicon);
            }
        }
    };

    private WebChromeClient mWebChromeClient = new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            OAuthActivity.this.setProgress(newProgress * 100);
        }
    };

    private Runnable mStart = new Runnable() {
        @Override
        public void run() {
            mOAuthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey, mConsumerSecret);
            mOAuthProvider = new CommonsHttpOAuthProvider(
                    mRequestTokenEndpointUrl, mAccessTokenEndpointUrl, mAuthorizationWebsiteUrl);
            String url = null;
            try {
                url = mOAuthProvider.retrieveRequestToken(mOAuthConsumer, mCallback);
            } catch (OAuthMessageSignerException e) {
                e.printStackTrace();
            } catch (OAuthNotAuthorizedException e) {
                e.printStackTrace();
            } catch (OAuthExpectationFailedException e) {
                e.printStackTrace();
            } catch (OAuthCommunicationException e) {
                e.printStackTrace();
            }
            if ((url != null) && (url.length() > 0)) {
                mWebView.loadUrl(url);
            } else {
                finish();
            }
        }
    };

    private Runnable mEnd = new Runnable() {
        @Override
        public void run() {
            setResult(RESULT_CANCELED);
            try {
                mOAuthProvider.retrieveAccessToken(mOAuthConsumer, mOAuthVerifier);
                String token = mOAuthConsumer.getToken();
                String tokenSecret = mOAuthConsumer.getTokenSecret();
                Intent intent = new Intent();
                if (((token != null) && (token.length() > 0)) &&
                     ((tokenSecret != null) && (tokenSecret.length() > 0))) {
                    intent.putExtra(OAuthActivity.TOKEN, token);
                    intent.putExtra(OAuthActivity.TOKEN_SECRET, tokenSecret);
                    setResult(RESULT_OK, intent);
                }
            } catch (OAuthMessageSignerException e) {
                e.printStackTrace();
            } catch (OAuthNotAuthorizedException e) {
                e.printStackTrace();
            } catch (OAuthExpectationFailedException e) {
                e.printStackTrace();
            } catch (OAuthCommunicationException e) {
                e.printStackTrace();
            }
            finish();
        }
    };

}

 

あわせてよみたい

ubuntu_android.PNG

Android のソースコードビルド環境を収録した Ubuntu ライブ CD を作成する方法について説明します。

この方法をマスターすると、クリーンな OS をインストール後、いきなり Android のソースコード取得&ビルドできるため、

インストール時にネットワーク環境を用意できない場合や、複数の PC に同じ環境を構築することができるため、大変便利です。

(しかも、OS インストール前のアーカイブイメージのため、持ち運べるほどサイズが小さい。)

 

事前準備

1. 作成したい Ubuntu の iso イメージを入手する

以下のサイトから作成したい Ubuntu のイメージをダウンロードします。

ここでは、「ubuntu-10.10-desktop-amd64.iso」をダウンロードしました。

 

2. ダウンロードした iso イメージをインストールし、Ubuntu を起動する

ここでは、VMware 上にインストール・起動しました。

 

Ubuntu Customization Kit (UCK)のダウンロード

以下のサイトから UCK のインストーラをダウンロードし、インストーラ実行します。

 

Ubuntu Customization Kit (UCK)の起動・カスタマイズイメージ作成

インストール後、UCK を起動するには、[Applications] > [System Tools] > [Ubuntu Customization Kit] をクリックします。

すると、対話式の画面が表示されますので、以下の様に進めてください。

※以下では、[Close] ボタンだけの画面の説明は省略しています

 

1. 「Please choose language packs to install」

インストールする言語パックを選択してください(複数可)。

ここでは、英語(en)、日本語(ja)の2言語をチェックしました。

 

2. 「Please choose languages will be available at boot of live CD」

ブート時に利用できる言語を選択してください(複数可)。

ここでは、英語(en)、日本語(ja)の2言語をチェックしました。

 

3. 「Please choose which language will be selected by default at boot of live CD」

ブート時に使用するデフォルト言語を選択してください。

ここでは、「ja」を選択しました。

 

4. 「Please choose desktop environments which will be present on customized CD」

カスタマイズCDで使用するデスクトップ環境を選択してください。

ここでは、「gnome」を選択しました。

 

5. 「Please choose an ISO image to be used as the basis for your live CD」

カスタマイズのベースとなるライブCDを選択してください。

ここでは、「ubuntu-10.10-desktop-amd64.iso」を選択しました。

 

6. 「Please enter the name for your CD」

カスタマイズしたライブCDの名前を入力してください。

ここでは、「Ubuntu10.10(64bit)」と入力しました。

 

7. 「Do you want to customize the CD manually during building」

カスタマイズCD構築中に手動でパッケージを編集するか選択してください。

ここでは、「yes」を選択しました。

 

8. 「Do you want to delete all windows-related files from the CD?」

Windows に関連するファイルをCDから削除するか選択してください。

ここでは、「no」を選択しました。

 

この後、パッケージの再構築が開始されます(少し時間がかかります)。

 

9. 「Please choose customization action」

パッケージの編集方法を選択してください。

ここでは、「Run console application」を選択しました。

 

ここから、任意のパッケージの追加や削除を行います。

作成したい環境に応じて適宜読み替えてください。

 

9-1. 「ia32-libs」用のリポジトリを追加

「ubuntu-10.10-desktop-amd64.iso」の初期状態では、「ia32-libs」の取得先リポジトリが不足していたのですが、

リポジトリがわからなかったため、起動OSの「/etc/apt/source.list」を開き、

カスタマイズ環境側の「/etc/apt/source.list」に、内容をコピーしました。

※リポジトリが通っている、または明示的に追加すべきリポジトリがわかっていれば、こんなことしなくてもよいです^^;

 

9-2. 「sun-java5-jdk」「sun-java6-jdk」用のリポジトリ追加

# add-apt-repository "deb http://archive.canonical.com/ lucid partner"
# add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse"
# add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse"

 

9-3. リポジトリの更新

# apt-get update

 

9-4. Android Source ビルドに必要なパッケージの追加

# apt-get install git-core gnupg flex bison gperf build-essential zip curl 
zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev 
ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

※ブログに掲載する都合上、改行していますが、実際には一行です

 

9-5. 「sun-java5-jdk」「sun-java6-jdk」の追加

# apt-get install sun-java5-jdk
# apt-get install sun-java6-jdk

 

9-6. 「repo」の追加

# cd /usr/local/bin
# curl http://android.git.kernel.org/repo > repo
# chmod a+x repo

ここでは、repo を、パスの通る適当な場所(/usr/local/bin)に配置しました。

 

9-7. その他、必要なパッケージの追加

以上で、Android ソースコードビルドに必要なパッケージが揃いましたが、

emacs(エディタ) など、その他必要と思われるパッケージを追加しておくと便利です。

 

9-8. 「Continute building」を選択して「OK」をクリックし、ビルドの構築を再開させる

 

10. 「Building was successful!」と表示されたら完了

作成したファイルは、「tmp/remaster-new-files/livecd.iso」に作成されます。

 

今回の例では、Windows 関連のファイルや不要なパッケージを削除しなかったため、

カスタマイズしたイメージは CDサイズ(700MB)を超えてしまいましたが、

作成された iso イメージをベースに何度でも再構築できるため、気に入るまで繰り返し作業してみてください。

 

付録

9.1、9.2 で追加した後の(カスタマイズ環境側)「/etc/apt/source.list」の内容は、以下のとおりです。

# deb cdrom:[Ubuntu 10.10 _Maverick Meerkat_ - Release amd64 (20101007)]/ maverick main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://us.archive.ubuntu.com/ubuntu/ maverick main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ maverick main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://us.archive.ubuntu.com/ubuntu/ maverick-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ maverick-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ maverick universe
deb-src http://us.archive.ubuntu.com/ubuntu/ maverick universe
deb http://us.archive.ubuntu.com/ubuntu/ maverick-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ maverick-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu 
## team, and may not be under a free licence. Please satisfy yourself as to 
## your rights to use the software. Also, please note that software in 
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://us.archive.ubuntu.com/ubuntu/ maverick multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ maverick multiverse
deb http://us.archive.ubuntu.com/ubuntu/ maverick-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ maverick-updates multiverse

## Uncomment the following two lines to add software from the 'backports'
## repository.
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://us.archive.ubuntu.com/ubuntu/ maverick-backports main restricted universe multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ maverick-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu maverick partner
# deb-src http://archive.canonical.com/ubuntu maverick partner

## This software is not part of Ubuntu, but is offered by third-party
## developers who want to ship their latest software.
deb http://extras.ubuntu.com/ubuntu maverick main
deb-src http://extras.ubuntu.com/ubuntu maverick main

deb http://security.ubuntu.com/ubuntu maverick-security main restricted
deb-src http://security.ubuntu.com/ubuntu maverick-security main restricted
deb http://security.ubuntu.com/ubuntu maverick-security universe
deb-src http://security.ubuntu.com/ubuntu maverick-security universe
deb http://security.ubuntu.com/ubuntu maverick-security multiverse
deb-src http://security.ubuntu.com/ubuntu maverick-security multiverse
deb http://archive.canonical.com/ lucid partner
deb-src http://archive.canonical.com/ lucid partner
deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

 

あわせて読みたい


※追記

  • 2010/11/22: 9-6 で chmod が漏れていたのを修正

GALAXY Tab 用のアドオンが公開されていました(Kazzz さんのツイートで気づきました^^)。

このアドオンをインストールすることで、GALAXY Tab 用のエミュレーターを利用することができるため、

GALAXY Tab の特徴である大きな画面サイズ(1024 x 600)やデザインで、アプリケーションの動作を検証することができます。

 

公式解説ページ

 

以下、公式解説ページの日本語語要約です。

 

アドオンインストール手順

1. 「Android SDK and AVD Manager」を起動する。

run_avd.PNG

 

2. 「Available Packages」を選択する。

available_packages.PNG

 

3. 「Add-on Site」をクリック、「http://innovator.samsungmobile.com/android/repository/srepository.xml」を入力し、「OK」をクリックする。

available_packages-2.PNG

add_site.PNG

 

4. 追加された「GALAXY Tab」用のアドオンをチェックした状態で、「Install Selected」をクリックする。

available_packages-3.PNG

 

5. ライセンスを確認後、「Accept All」をクリック、「Install」をクリックする。

install.PNG

 

6. インストールが完了したら、「Close」をクリックする

install2.PNG

 

AVD(エミュレーター)作成手順

1. 「Virtual Device」をクリックし、「New」をクリックする。

avd1.PNG

 

2. 下図のように設定し、「Create AVD」をクリックする(Name や SD カードサイズは任意でOK)。

avd2.PNG

 

3. 作成したAVDを選択し、「Start」をクリック、Launch Options を設定し、「Launch」をクリックすると、エミュレータが起動します。

※画面サイズが大きいため、下図のようにスケールした方がよいです

※エミュレーターの画面の向きは、Ctrl + F11 で回転します

avd3.PNG

launch.png

emulator.PNG

2010年11月18日、Android Market のデベロッパーコンソールの仕様が変更されました。

近いうちに Android Market アプリ(Webサイト?)も更新されるかな?


変更点

  1. 高解像度アイコン(512 x 512)の画像の登録(必須)
  2. Feature Graphic(1024 x 500)の画像の登録(オプション)
  3. プロモーションビデオ用 YouTube URL の登録(オプション)

AndroidMarketDevCon.PNG


追記

以下、Android Market Support からのメール(2010/11/18)の原文です。

※1. 「最近の変更点」、2. 「ドラフトアップロード」、3. 「大きいプロモーション用画像」について記載されています(required が?)。


Hello,

We're writing to inform you about some changes to Android Market that require your attention.

First, we have added support for a recent changes feature, which allows you to add notes about changes specific to the newest version of your application. You are able to submit these from the Developer Console, similar to descriptions.
In the Market app, these notes will appear under the app description as "Recent changes."

Second, there is now a 'draft upload' capability for application updates. This feature enables you to edit your app listing and upload a new version without affecting the version live in Market. Your app listing edits will not change your live listing until you select "Publish."

Finally, we are adding support for larger promotional graphics to showcase your application. In addition to the currently required app screenshot, you will be required to upload one "feature" graphic. Supported promotional assets will now include:
 - A "feature" graphic, landscape aspect ratio, 1024 x 500 (required).
 - A high-res icon, 512 x 512 (required)..  The Android icon design guidelines located at http://developer.android.com/guide/practices/ui_guidelines/icon_design.html apply.
 - 2 screen shots, 320w x 480h, 480w x 854h, or 480w x 800h, increasing to 8 screen shots in the future (1 required).
 - A link for a promotional video hosted on YouTube (optional).

Thanks, and we look forward to continue working with you on Android Market.

Regards,
The Android Market Team

<<前のページへ 345678910111213

Android Advent Calendar 2011

2012年2月

      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