‘java’ タグのついている投稿

オプションメニューのアイコンと文字を横並びにしたかった

前回オプションメニューの文字色とフォントを変更するエントリを書きましたが、アイコンの隣に文字を表示したい要件が出てきました。

前回
OptionsMenuの文字色を変更する : blog.loadlimit – digital matter –

で、色々やってみましたが、手詰まりしてしまいました。やっぱりアイコンと文字をセットにした画像を用意してしまって、文字は消してしまう方が確実です。

惜しいところまで行った現状の記録を残しておきます。

device-2011-10-22-174653

なんですかね、心が離れてしまったんですかね。

ソース

public class CustomizedMenuActivity extends Activity {
	public static final int MENU_ID_COFFEE = 1;
	public static final int MENU_ID_LOVE = 2;
	public static final int MENU_ID_RECYCLE = 3;

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

	protected TextView getMenuItemView(MenuItem item) {
		try {
			Class<?> c = item.getClass(); // MenuItemImplのインスタンス
			Class<?>[] paramTypesGetItemView = { int.class, ViewGroup.class };
			Method method;
			method = c.getDeclaredMethod("getItemView", paramTypesGetItemView);
			// getItemViewはprivateメソッドなのでアクセス可能に変更する
			method.setAccessible(true);
			// IconMenuItemViewを取得できる
			TextView view = (TextView) method.invoke(item, new Object[] { 0,
					null });
			return view;
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// メニューアイテムの追加
		MenuItem menuItemCoffee = menu.add(Menu.NONE, MENU_ID_COFFEE,
				Menu.NONE, this.getText(R.string.menu_coffee)).setIcon(
				R.drawable.icon_coffee);
		MenuItem menuItemLove = menu.add(Menu.NONE, MENU_ID_LOVE, Menu.NONE,
				this.getText(R.string.menu_love)).setIcon(R.drawable.icon_love);
		MenuItem menuItemRecycle = menu.add(Menu.NONE, MENU_ID_RECYCLE,
				Menu.NONE, this.getText(R.string.menu_recycle)).setIcon(
				R.drawable.icon_recycle);

		try {
			TextView viewCoffee = getMenuItemView(menuItemCoffee);
			TextView viewLove = getMenuItemView(menuItemLove);
			TextView viewRecycle = getMenuItemView(menuItemRecycle);

			// テキストの色を変える
			viewCoffee.setTextColor(0xFFB5985A);
			viewCoffee.setTextSize(14);
			viewCoffee.setTextScaleX(0.8f);

			viewLove.setTextColor(0xFFCF7D5B);
			viewLove.setTextSize(22);
			viewLove.setTypeface(Typeface.DEFAULT_BOLD);

			viewRecycle.setTextColor(0xFF8A6381);
			viewRecycle.setTextSize(16);
			viewRecycle.setTypeface(Typeface.create(Typeface.SERIF,
					Typeface.BOLD_ITALIC));

			// アイコン画像を取得
			Field field = viewLove.getClass().getDeclaredField("mIcon");
			field.setAccessible(true);
			Drawable icon = (Drawable) field.get(viewLove);
			// アイコンの描画領域を取得
//			Rect iconRect = icon.getBounds();
//			iconRect.left += 50;
//			iconRect.right += 50;
//			icon.setBounds(iconRect); // ※IconMenuItemViewクラスのonLayoutで上書きされてしまう
			// アイコンを文字の左側に表示する
			viewLove.setCompoundDrawables(icon, null, null, null);
			// 文字の配置を中央寄せにする
			viewLove.setGravity(Gravity.CENTER_VERTICAL
					| Gravity.CENTER_HORIZONTAL);

		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}

		return super.onCreateOptionsMenu(menu);
	}

}

問題はIconMenuItemViewクラスでpositionIconメソッドがアイコンの位置を決定しているのですが、onLayoutのタイミングで呼び出されるので、上書きされてしまうようなのですね。

ActivityのViewでonLayoutをオーバーライドして、うまくいけばアイコンが描画される前に位置変更差し込めるのかなぁ?

ちょっともう面倒なので画像にしてしまいます。

icon_love2

device-2011-10-22-182542

あ、いいですね。まずは画像登録とテキストを空に。

		MenuItem menuItemLove = menu.add(Menu.NONE, MENU_ID_LOVE, Menu.NONE,
				null).setIcon(R.drawable.icon_love2);

文字の分の空白が下に空いてしまうので、文字サイズを1にしておきます。0は効かないようです。

viewLove.setTextSize(1);

これで一応できました。

MenuView.ItemViewを実装すればこんな事しなくてもViewをまるごとカスタマイズできるのかな…

ちょっともう少し調べてみます。

Menu::add→Menu::addInternal→new MenuItemImpl

で、MenuItemImplのgetItemViewを呼び出したタイミングでMenuItemImpl::createItemViewが呼び出されます。

    private MenuView.ItemView createItemView(int menuType, ViewGroup parent) {
        // Create the MenuView
        MenuView.ItemView itemView = (MenuView.ItemView) getLayoutInflater(menuType)
                .inflate(MenuBuilder.ITEM_LAYOUT_RES_FOR_TYPE[menuType], parent, false);
        itemView.initialize(this, menuType);
        return itemView;
    }

getLayoutInflaterは同じクラスのメソッド。

    public LayoutInflater getLayoutInflater(int menuType) {
        return mMenu.getMenuType(menuType).getInflater();
    }

リフレクションで呼んで何が返ってくるのか見て見ました。menuTypeはアイコンメニューなので0。

			Class<?>[] param = {int.class};
			method = c.getDeclaredMethod("getLayoutInflater", param);
			LayoutInflater mLayoutInflater = (LayoutInflater) method.invoke(item, new Object[] { 0 });
			Log.d(TAG, "" + mLayoutInflater.getClass().getName());

com.android.internal.policy.impl.PhoneLayoutInflater

public class PhoneLayoutInflater extends LayoutInflater

えー…

PhoneLayoutInflaterでinflateメソッドはオーバーライドされていないので、LayoutInflaterのinflateを見る。呼ばれたのはこれかな。

    public View inflate(int resource, ViewGroup root, boolean attachToRoot) {
        if (DEBUG) System.out.println("INFLATING from resource: " + resource);
        XmlResourceParser parser = getContext().getResources().getLayout(resource);
        try {
            return inflate(parser, root, attachToRoot);
        } finally {
            parser.close();
        }
    }

resourceは、com.android.internal.R.layout.icon_menu_item_layoutですね。

frameworks/base/core/res/res/layout/icon_menu_item_layout.xml

<com.android.internal.view.menu.IconMenuItemView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/title"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="1dip"
    android:paddingLeft="3dip"
    android:paddingRight="3dip"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:fadingEdge="horizontal" />

あー、ここにあったのか。

割り込める可能性があるとすれば、MenuItemImplクラスのgetItemViewメソッド。

    View getItemView(int menuType, ViewGroup parent) {
        if (!hasItemView(menuType)) {
            mItemViews[menuType] = new WeakReference<ItemView>(createItemView(menuType, parent));
        }
        
        return (View) mItemViews[menuType].get();
    }

つまり、mItemViewsにリフレクションで先にViewを入れておけばいいってことですかね。

うーん…


OptionsMenuの文字色を変更する

Activityで端末のメニューボタンを押したときに出てくるオプションメニューですが、文字の色が変えられなくて困っていました。

Themeのandroid:panelTextAppearanceで変えられるのかと思っていたのだけど、なぜかうまく行かず。

背景画像はテーマで変更できるのですが。

リフレクションを使ってテキストカラーの変更をしてみました。Android API 8で確認しています。

デフォルト

device-2011-10-22-120919

文字色変更

device-2011-10-22-135742

Activityのコード

public class CustomizedMenuActivity extends Activity {
	public static final int MENU_ID_COFFEE = 1;
	public static final int MENU_ID_LOVE = 2;
	public static final int MENU_ID_RECYCLE = 3;

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

	private TextView getMenuItemView(MenuItem item) {
		try {
			Class<?> c = item.getClass(); // itemはMenuItemImplのインスタンス
			Class<?>[] paramTypesGetItemView = { int.class, ViewGroup.class };
			Method method = c.getDeclaredMethod("getItemView", paramTypesGetItemView);

			// getItemViewはprivateメソッドなのでアクセス可能に変更する
			method.setAccessible(true);

			// IconMenuItemViewを取得できる
			TextView view = (TextView) method.invoke(item, new Object[] { 0, null });

			return view;
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// メニューアイテムの追加
		MenuItem menuItemCoffee = menu.add(Menu.NONE, MENU_ID_COFFEE,
				Menu.NONE, this.getText(R.string.menu_coffee)).setIcon(
				R.drawable.icon_coffee);
		MenuItem menuItemLove = menu.add(Menu.NONE, MENU_ID_LOVE, Menu.NONE,
				this.getText(R.string.menu_love)).setIcon(R.drawable.icon_love);
		MenuItem menuItemRecycle = menu.add(Menu.NONE, MENU_ID_RECYCLE,
				Menu.NONE, this.getText(R.string.menu_recycle)).setIcon(
				R.drawable.icon_recycle);

		try {
			TextView viewCoffee = getMenuItemView(menuItemCoffee);
			TextView viewLove = getMenuItemView(menuItemLove);
			TextView viewRecycle = getMenuItemView(menuItemRecycle);

			// テキストの色を変える
			viewCoffee.setTextColor(0xFFB5985A);
			viewCoffee.setTextSize(14);
			viewCoffee.setTextScaleX(0.8f);

			viewLove.setTextColor(0xFFCF7D5B);
			viewLove.setTextSize(22);
			viewLove.setTypeface(Typeface.DEFAULT_BOLD);

			viewRecycle.setTextColor(0xFF8A6381);
			viewRecycle.setTextSize(16);
			viewRecycle.setTypeface(Typeface.create(Typeface.SERIF,
					Typeface.BOLD_ITALIC));

		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		}

		return super.onCreateOptionsMenu(menu);
	}
}

MenuItemの実体はMenuItemImplクラスで、getItemViewメソッドを使ってIconMenuItemViewクラスを取り出しています。

IconMenuItemViewクラスはTextViewを継承しているので、キャストすればテキストカラーやフォントサイズなどの変更ができます。

ちなみに、このあと、メニューのセパレータ(divider)画像の変更とアイコンと文字の配置の変更もやりました。それは次以降のエントリで。

オプションメニューのアイコンと文字を横並びにしたかった : blog.loadlimit – digital matter –


ライブ壁紙開発時にUSBケーブルを接続しないと起動しない問題

問題というほどでもなかった。Androidのライブ壁紙作成のお話。

ライブ壁紙をステップ実行してデバッグするためにwaitForDebuggerを書いたのはいいのだけど、それを忘れてデバッグ用じゃない端末にインストールすると、一向にライブ壁紙を選択した後の「ライブ壁紙を読み込み中…」から進まない。

開発用端末でUSBケーブルを繋いでいると先に進めてしまうので、isDebuggerConnectedメソッドで分岐するようにしました。

public class MyWallpaperService extends WallpaperService {

	private final Handler handler = new Handler();

	@Override
	public Engine onCreateEngine() {
		if (android.os.Debug.isDebuggerConnected() // ここでデバッガが繋がっているか判定
				&& MyApplication.isDebuggable()) { // こっちはmanifestのdebuggableを読む実装
			android.os.Debug.waitForDebugger();    // デバッガ待機
		}
		return new MyEngine();
	}

	// do something ...

}


Androidで地磁気センサーの値が取れない問題

いや、取れないわけじゃないですけどね。SensorManager.SENSOR_STATUS_UNRELIABLEにハマった…

駄猫の備忘録: 久々にセンサーを使ってみた

XPERIA rayで方位が取れない問題があったので、調べていたところaccuracyのチェックでメソッドを抜けていたことが判明…完全に見落としてた。

	@Override
	public void onSensorChanged(SensorEvent event) {

		if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
			return;
		}

		switch (event.sensor.getType()) {
		case Sensor.TYPE_MAGNETIC_FIELD:
			magneticValues = event.values.clone(); // ■ここに来ない
			break;
		case Sensor.TYPE_ACCELEROMETER:
			accelerometerValues = event.values.clone();
			break;
		}

		// do something ...

	}

GALAXY Sでも方向が取れないと報告があったので多分これでしょう。

キャリブレーションすればいいのかな…


Heap updates are NOT ENABLED for this client

How to enable Heap updates on my android client – Stack Overflow

EclipseのDDMSでAndroid実機端末のヒープを見る方法のメモ。

heap1

heap2

デバイスビューの緑の筒みたいなアイコンをクリックします。

heap3

これでヒープが見られるようになります。

heap4


CoreException: Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resource-plugin:2.4.3

Eclipse 3.7(Indigo)で、m2eをインストールしてTwitter4jをインポートしたあと、pom.xmlで

CoreException: Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resource-plugin:2.4.3

というエラーが表示されてビルドできないという現象がありました。

m2eの再インストールとか色々試したのですが、以下の情報で解決できました。

De GIS, Programación y Otros Demonios: Maven Error: Could not calculate build plan

Windowsのユーザーフォルダにある.m2\repositoryフォルダの中から、「.lastUpdated」という拡張子がついたファイルを検索します。

ファイルが見つかったら、それを削除します。

Eclipseのプロジェクトエクスプローラー上から、プロジェクトを選択して、右クリック、Maven→Update Project Configuration…を選択、プロジェクトを選択してOKを押すだけです。


MavenのプロジェクトをEclipseにインポートする

環境はWindows7+Eclipse 3.7(Indigo)。

以前、m2eclipseと呼ばれていたプロジェクトは正式にEclipseのプロジェクトに取り込まれて、今はm2eとしてEclipseのレポジトリからインストールできます。

Webで検索すると、sonatypeのサイトにリンクしている、情報が古いエントリが多く出てくるので注意。

メニューのHelp→Install New Software…で、Work withに「Indigo – http://download.eclipse.org/releases/indigo」を選択。

「type filter text」の欄に「maven」と入力すれば「m2e」が表示されます。「m2e – Maven Integration for Eclipse    1.0.0.20110607-2117」にチェックを入れて、先に進めばインストールできます。

実際にMavenのプロジェクトを取り込むときは、メニューのFile→Import→Maven→Existing Maven Projectsを選択して、「Root Directory」の欄にpom.xmlのあるディレクトリを指定すればProjectsのリストが表示されます。


AndroidアプリからFacebookアプリに画像をキャプション付きで投稿する

Androidにて、ActivityからFacebookにギャラリーの画像をシェアする際に、画像の説明であるキャプションを指定する方法がわからなかったので調べました。

結論としてはIntent.EXTRA_TITLEを指定すれば良いようです。

TwitterやメールではIntent.EXTRA_TEXTとかなので、そのままだとFacebookアプリには反映されません。

String text = "Some caption...";
Uri path = Uri.parse("content://media/external/images/media/1"); // Gallery's URI etc.

Intent intent = new Intent(Intent.ACTION_SEND);

// キャプション
intent.putExtra(Intent.EXTRA_TITLE, text);

// 添付ファイル
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, path);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(Intent.createChooser(intent, getString(R.string.post_facebook)));

追記 2012/09/20

Facebookのプラットフォームにより、Intentでテキストを追加することができなくなったそうです。
Bug – Android Intent Sharing is Broken – Facebook開発者


Androidのライブ壁紙をActivityから指定したい

アプリの一覧からアイコンを押したら、ライブ壁紙をプレビュー→壁紙に設定できる状態にできないかという話題。

ちなみに結論としてはパーミッション不足により失敗です。

ライブ壁紙の選択画面を表示させることはできるので、
Live Wallpaper – Binding an Activity to the ‘Open’ button of the market
こちらを参考にライブ壁紙選択画面の上にカスタムビューなどを表示させて誘導させるのが次善の策かと思います。

ライブ壁紙選択画面を表示するだけなら

Intent intent = new Intent(); 
intent.setAction(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER); 
startActivity(intent); 

でOK。

以下は失敗の記録。

上で書いたライブ壁紙選択画面表示のコードは 
LiveWallpaperをアプリから設定する方法を探ってみた|いろいろ備忘録

こちらの方法でも代替できます。

LiveWallpaperListActivityのソースコードを持ってきて追いかけてみることにしました。

LiveWallpaperListActivity.java

これを同じパッケージ内に設置して、layoutやdimen、color等を適当に用意してやることで、選択画面は同じ物を再現できます。

一応、用意したファイル

live_wallpaper_list.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="6dip" android:paddingRight="6dip" android:paddingTop="6dip" android:paddingBottom="6dip" android:minHeight="?android:attr/listPreferredItemHeight"> 
<ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:drawSelectorOnTop="false"/> 
<TextView android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:visibility="gone" android:text="@string/live_wallpaper_empty" android:textAppearance="?android:attr/textAppearanceMedium"/> 
</LinearLayout>

live_wallpaper_entry.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="wrap_content" android:paddingLeft="6dip" android:paddingRight="6dip" android:paddingTop="6dip" android:paddingBottom="6dip" android:minHeight="?android:attr/listPreferredItemHeight"> 
<ImageView android:id="@+id/thumbnail" android:layout_width="@dimen/live_wallpaper_thumbnail_width" android:layout_height="@dimen/live_wallpaper_thumbnail_width" android:layout_gravity="center_vertical" android:scaleType="centerCrop"/> 
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dip" android:layout_marginRight="8dip" android:layout_centerVertical="true" android:layout_toRightOf="@id/thumbnail" android:orientation="vertical"> 
<TextView android:id="@+id/title_author" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:singleLine="true" android:ellipsize="marquee"/> 
<TextView android:id="@+id/description" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:maxLines="3"/> 
</LinearLayout> 
</RelativeLayout>

color.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="live_wallpaper_thumbnail_background">#000000</color> 
    <color name="live_wallpaper_thumbnail_text_color">#ffffff</color> 
</resources>

dimens.xml (値は適当にいれた)

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="live_wallpaper_thumbnail_width">50dp</dimen> 
    <dimen name="live_wallpaper_thumbnail_height">50dp</dimen> 
    <dimen name="live_wallpaper_thumbnail_text_size">50dp</dimen> 
    <dimen name="live_wallpaper_thumbnail_text_offset">50dp</dimen> 
</resources>

で、このままでは

LiveWallpaperPreview.showPreview(this , REQUEST_PREVIEW, intent, info);

の行がコンパイルできないのでshowPreviewメソッド(staticメソッド)だけを取り出してきてLiveWallpaperListActivityに

	static final String EXTRA_LIVE_WALLPAPER_INTENT = "android.live_wallpaper.intent";
	static final String EXTRA_LIVE_WALLPAPER_SETTINGS = "android.live_wallpaper.settings";
	static final String EXTRA_LIVE_WALLPAPER_PACKAGE = "android.live_wallpaper.package";

	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		final Intent intent = mWallpaperIntents.get(position);
		final WallpaperInfo info = mWallpaperInfos.get(position);
		//LiveWallpaperPreview.showPreview(this, REQUEST_PREVIEW, intent, info);
		//Intent preview = new Intent(this, LiveWallpaperPreview.class);
		String clazz = "com.android.wallpaper.livepicker.LiveWallpaperPreview";
		Intent preview = new Intent(Intent.ACTION_MAIN);
		int idx = clazz.lastIndexOf('.');
		String pkg = clazz.substring(0, idx);
		preview.setClassName(pkg, clazz);
		preview.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		preview.putExtra(EXTRA_LIVE_WALLPAPER_INTENT, intent);
		preview.putExtra(EXTRA_LIVE_WALLPAPER_SETTINGS,
				info.getSettingsActivity());
		preview.putExtra(EXTRA_LIVE_WALLPAPER_PACKAGE, info.getPackageName());
		this.startActivityForResult(preview, REQUEST_PREVIEW);
	}

先程のサイトを参考に、こんな感じで書き換え。で、実行。

FATAL EXCEPTION: main 
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.android.wallpaper.livepicker/.LiveWallpaperPreview (has extras) } from ProcessRecord{4073a338 8432:com.sample.android.TestCase/10077} (pid=8432, uid=10077) requires null 
    at android.os.Parcel.readException(Parcel.java:1322) 
    at android.os.Parcel.readException(Parcel.java:1276) 
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1351) 
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1374) 
    at android.app.Activity.startActivityForResult(Activity.java:2827) 
    at com.sample.android.TestCase.LiveWallpaperListActivity.onItemClick(LiveWallpaperListActivity.java:201) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
    at android.widget.ListView.performItemClick(ListView.java:3513) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method)

とりあえずライブ壁紙の一覧とアイコンは取れるってことはわかりましたね…


Eclipse 3.6(Helios)でAndroid SDKのコード補完が遅い問題

Android開発時に、コード補完が死ぬほど遅い問題の解決方法をまとめておきます。

参考にしたのは以下。

つまりはソースコードをダウンロードして展開しておけばいいということですね。

2.2(froyo)の場合

http://android.git.kernel.org/?p=platform/frameworks/base.git;a=snapshot;h=froyo;sf=tgz

base-froyo-73e150c.tar.gz、107MBでダウンロードは10分ほどでした。

展開すると、pax_global_headerというファイルとbase-froyo-73e150cというディレクトリができるので、base-froyo-73e150cをsoucesに名前変更して、

android-sdk-windows\platforms\android-8

の下に移動して完了。

2.1(eclair)の場合はダウンロードURLのh=froyoをh=eclairに変更して、展開先をandroid-7\sourcesにすればOK。

展開すればEclipse再起動しなくても有効になります。