ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2013年2月20日水曜日

【Android】SDK Managerで更新時に「A folder failed to be moved.」

SDK Manager で Update を行った場合に下記のメッセージが出る時がある。

 A folder failed to be moved. On Windows this typically means that a program is using that folder (for example Windows Explorer or your anti-virus software.) Please momentarily deactivate your anti-virus software or close any running programs that may be accessing the directory '(Android SDKのインストールフォルダ)'. When ready, press YES to try again. 


エミュレータ起動中だったら起きるっぽい。 終了してからアップデートを再実行。

2012年1月19日木曜日

【Android】Proguard で『error conversion to Dalvik format failed with error 1』

Android で Proguard を使い、リリース用APK作成時に出たエラー。
error conversion to Dalvik format failed with error 1

これの対処のため、検索していると

・EclipseのClean
・project.propertiesのSDK設定が合ってない
・SDKが2重に読み込まれている
・SDKの読込順序が間違っている
・Proguardのbatの命令を %1 %2 %3 のように変える
・Proguardを更新する(現在 4.7時点)

のように対処方法が書いてあったんですが、
全部試しても無理でした。

そしてもっと調べていたら英語のページに

http://stackoverflow.com/questions/6605971/android-sdk-tools-revision-12-has-problem-with-proguard-error-conversion-to

The only solution i've found to this problem is to change, in proguard.cfg

-optimizationpasses 5

to

-optimizationpasses 2

と書いてありました。
proguard.cfg を直してみるとそれでリリース用APKが作成できました。

調べると、 optimizationpasses は最適化回数らしく、
たぶんですが、proguard をどれぐらいの強さでかけるか、ということだと思います。

5 から 2 に落としたことでうまくAPKはできたのですが、
難読化は弱くなっているのでは、、と思います。

またわかればブログに書きたいと思います。

2011年12月17日土曜日

【Android】ウィジェットを確実に更新させる

Androidのウィジェットの内容を更新する場合、以下のように
updateAppWidgetとすると思います。

    private void updateAppWidget(Context context, RemoteViews remoteViews) {
        ComponentName thisWidget = new ComponentName(context, ClockAppWidgetProvider.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(context);
        manager.updateAppWidget(thisWidget, remoteViews);
    }

ただ、複数配置した時など、各ウィジェットへ確実に更新が行われないようです。
特に時計ウィジェットだと顕著です。

その場合、

int[] appWidgetIds = manager.getAppWidgetIds(thisWidget);
for (int i : appWidgetIds) {
    manager.updateAppWidget(i, remoteViews);
}

のように各ウィジェットIDに対して更新するようにすると、確実に更新されるようです。

ただし、重いです。。何が原因で重いのかはまだわからないですが、、、

2011年12月16日金曜日

【Android】ダイアログで画面外を触った場合に閉じる

ダイアログは2種類ある。

通常の Dialog を継承しているもの。
Activityにtheme (@android:style/Theme.Dialog など) を設定してDialog風にしているもの。

指定の方法がそれぞれ違う。



1. 通常の Dialog を継承しているもの。
final AlertDialog dialog = alertinformation.create();
dialog.setCanceledOnTouchOutside(true);

Dialog に対して、setCanceledOnTouchOutside を設定してやるといい。

2. Activityにtheme (@android:style/Theme.Dialog など) を設定してDialog風にしているもの。
    // ウィンドウ外を触った場合、閉じる
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Rect dialogBounds = new Rect();
        getWindow().getDecorView().getHitRect(dialogBounds);

        if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) {
            this.finish();
        }
        return super.dispatchTouchEvent(ev);
    }

イベントで画面外をタッチしている場合に画面を終了する。

2011年12月15日木曜日

【Android】Proguard使用時の注意点

Proguard使用時の注意

元々Android用ではないため、Javaのソースのみを難読化し、
XMLは無視する様子。

そのため、難読化しないクラスを除外設定しないといけない。

proguard.cfg に設定があるので編集する。

1. クラス名の難読化除外。

おすすめ
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.view.View
-keep public class * extends android.support.v4.app.Fragment

この場合、クラス名は何でもよくてandroid.view.View、またはその子を継承しているもの
-keep public class * extends android.view.View

2. メソッド名の難読化除外

xml に android:onClick がある場合、xmlは難読化しないのでjavaのメソッド名も除外に指定する。

-keepclassmembers class * {
public void On*Click(android.view.View);
public void on*Click(android.view.View);
}

そのため、onClickメソッドはやっぱり on*Click という命名規則にした方が良い。

2011年11月4日金曜日

【Android】ProgressBarをコードで作成時にバー状態にする

ProgressBarをコードで作ると style が変更できないように見えます。
どうやら以下の方法で変えれるみたいです。
styleと名のつくものは全てそうかも。ていうかこれはテーマってことかな?

ProgressBar progress = new ProgressBar(this,null,android.R.attr.progressBarStyleHorizontal);

コンストラクタの第3引数で設定したらいいみたい。
android.R.attr.progressBar~ に他のスタイルもあります。

他に xml でProgressBarを定義して Inflate する方法でもいいですね。

2011年7月28日木曜日

第3回SHARPハッカソンに行ってきました

7月23日、24日の土日にて 第3回SHARPハッカソンに行ってきました。

私としては初めてのハッカソンだったため、ドキドキしながら行ってきました。
場所は広島の八本松。
名古屋から広島まで新幹線に乗っていき、そこから鈍行に乗り、八本松までという長い道のりでした。


参加者はテレビで見たならぬ、ネットで見たことある!という豪華メンバー多数。
今まで会ってみたいなって思ってた人にも会えました。
こんなすごい人達と一緒に参加できることが大変ありがたかったです!

ハッカソンでは
SHARPさんから2011年夏モデルの最新端末をお借りし、
チームで2日間の期間を使い、アイデア出しからアプリを完成するところまでするというものでした。

自分たちのチームは、   TEAM びすこ。
メンバーは、
デザイナー
 @korowan
 @rie05
開発者
 @itog
 @dd0125 (自分)
という構成でした。

デザイナーさんがいるということは新鮮でした!

アイデアとしては色々候補はあったのですが
せっかくSHARPのイベントなので、SHARP API と使おうということで、

歩数計APIでコインを貯め、開閉通知APIで動かすスロットということで決定。
@rie05 さんの ウキウキノコ というキャラクターを使わせてもらいました。

1日目、1日目の夜、2日目と開発を頑張った結果がこれ。


うちのチームは39分から!



最後に一番面白かったチームはということで投票をするのですが、
な、な、なんと準優勝を頂けました。
頑張ったことは確かですが、皆さんすごかったのでいいのかなーって思いながらでした。
すごく嬉しかったです。





帰りは広島焼きを食べて帰りました。

よし、最後に広島らしいことした!



・今回感じたこと

デザイナーと開発者が混ざると科学反応が起きるということ。

開発者はデザイナーさんが作った綺麗な画像を動かせることに感動。
デザイナーさんは自分が作ったものが動くことに感動。
双方いい影響を与えてる!

またハッカソン参加したいなーって思いました。^^

SHARPのみなさん、ブリリアントサービスのみなさん!
そして参加者のみなさん、メンバーのみなさん、ありがとうございました!


イベントについて更に詳しくはこちらのブリリアントサービスさんのブログで
http://d.hatena.ne.jp/bs-android/20110727

2011年7月21日木曜日

【Android】他パッケージのActivityを呼び出すには

例えば電池使用量の画面を出すには、結論から言うと、
Intent intent = new Intent(Intent.ACTION_MAIN);
        ComponentName compo = new ComponentName("com.android.settings","com.android.settings.fuelgauge.PowerUsageSummary");
        intent.setComponent(compo);
        startActivity(intent);

・ComponentName に パッケージ名とクラス名を設定しています。

他の画面はどうやって出すの?って気になった場合は

なにか画面を起動したときに出る、
LogCatの
07-21 02:47:06.246: INFO/ActivityManager(116): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.contacts/.DialtactsActivity bnds=[5,244][115,362] } from pid 1016
を参照し、 cmp=com.android.contacts/.DialtactsActivity となってるのが、
パッケージ名とクラス名。ちなみにこれは電話アプリ。

この場合は、
ComponentName("com.android.contacts","com.android.contacts.DialtactsActivity");
となる。

これで電話アプリが起動する。

2011年7月19日火曜日

【Android】文字列から id(int型) を取得する

現在のActivityのパッケージリソースから取得する場合は、

R.string.XXXXX というリソースでは、

int resid = getResources().getIdentifier("XXXXX","string",this.getPackageName());

と取得。

R.drawable.YYYY では、

int resid = getResources().getIdentifier("YYYY","drawable",this.getPackageName());

で取れる!

2011年6月29日水曜日

【Android】viewのidからid名を取得する

Context.getResources().getResourceEntryName(view.getId())

コードハイライト使う必要ないねw

2011年5月16日月曜日

【Android】日齢計算アプリ更新

日齢計算アプリを更新しました。

・入力した誕生日を保存
・TwitterなどにShareできる
・カレンダーに登録できる

そんな機能を追加しました。

でもデザインは手抜き。
もっと力を入れてやらないといけんっちゃいけんのだけど、
家にいて気が抜けるのともっと力を入れないといけないのもあるのでねぇ。。。

とりあえずやりたいとこまではできた感じ。

HandMemoのマルチタッチ時のおかしな動作も直さないといけないなー。。

2011年3月15日火曜日

【Android】祝!アンドロイダー掲載

アンドロイダーに初めて掲載されました。

レトロライツアウト!

http://androider.jp/a/601db07b8ec543c0/

実は最初のテストアプリを覗いて、一番時間をかけていないアプリなんですが、
これが掲載されました。

他のアプリも掲載されたらなぁー、って思ってます^^

2011年1月17日月曜日

【Android】AdMobが表示されない場合にAdMakerを表示するクラス

前に使ったクラスを晒します。

package jp.dd0125.common;

import jp.co.nobot.libYieldMaker.libYieldMaker;
import android.app.Activity;
import android.util.Log;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;

import com.admob.android.ads.AdListener;
import com.admob.android.ads.AdView;

public class CommonAdMob_AdMaker {
 private static final String TAG = "CommonAdvertisement";

 ProgressBar pb;
 AdView adView;
 libYieldMaker adMaker;
 Activity act;
 public CommonAdMob_AdMaker(Activity act){
  this.act = act;

  pb = new ProgressBar(act);
  pb.setVisibility(ProgressBar.VISIBLE);


  //pb.setGravity(android.view.Gravity.RIGHT);
  pb.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

 }




 public void createAdMob(int align){
        adView = new AdView(act);
        adView.setVisibility(android.view.View.VISIBLE);
        adView.requestFreshAd();

        adView.setGravity(align);
        adView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));


        adView.setAdListener(new AdListener() {

            public void onReceiveRefreshedAd(AdView adView) {
                Log.d(TAG, "AdListener.onReceiveRefreshedAd called!");
            }

            public void onReceiveAd(AdView adView) {
                Log.d(TAG, "AdListener.onReceiveAd called!");
                // 広告が表示できたのでProgressBarを消す
                pb.setVisibility(ProgressBar.GONE);
            }

            public void onFailedToReceiveRefreshedAd(AdView adView) {
                Log.d(TAG, "AdListener.onFailedToReceiveRefreshedAd called!");
            }

            public void onFailedToReceiveAd(AdView adView) {
                Log.d(TAG, "AdListener.onFailedToReceiveAd called!");
                // プログレスバーを消す
                pb.setVisibility(ProgressBar.GONE);


                // AdMaker の広告を設定している場合、AdMakerの広告を表示するのでAdViewの更新を行わせない
                if(adMaker != null){
                    adView.setRequestInterval(0);
                    adView.setVisibility(AdView.GONE);

                    // AdMakerの広告を表示させる
                    adMaker.setVisibility(libYieldMaker.VISIBLE);
                    adMaker.startView();

                }
            }
        });
 }

 public void createAdMaker(String url){
  adMaker = new libYieldMaker(act);
        adMaker.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

        adMaker.setActivity(act);
        adMaker.setUrl(url);

 }
 public RelativeLayout getAdMob_AdMaker(){
  RelativeLayout layout = new RelativeLayout(act);
  layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

  layout.setGravity(android.view.Gravity.CENTER);
  layout.addView(pb);
  if(adView != null){
   layout.addView(adView);
  }
  if(adMaker != null){
   layout.addView(adMaker);
   if(adView == null) {
    pb.setVisibility(ProgressBar.GONE);
    adMaker.setVisibility(libYieldMaker.VISIBLE);
    adMaker.startView();
   }
  }
  return layout;
 }
}

このように使います。

// 広告
 //AdManager.setTestDevices( new String[] {
 //  AdManager.TEST_EMULATOR,
 //  //"XXXXXXXXXXXXXXXXXXXX",
 //  });
 LinearLayout l_ad = (LinearLayout)findViewById(レイアウトID);
 CommonAdMob_AdMaker Ad;
 Ad = new CommonAdMob_AdMaker(this);
 Ad.createAdMob(RelativeLayout.ALIGN_TOP); // AdMobを生成
 Ad.createAdMaker("http://stg-images.ad-maker.info/sample-test.html"); // AdMakerを生成

 l_ad.addView(Ad.getAdMob_AdMaker()); // 広告を持ったレイアウトが返ってきますので addViewします

ただし、
・res/values/attr.xml
・AdMob と AdMaker の jarライブラリ組み込み
は必要です。

【Android】HandMemo 0.5 をアップデートしました。

HandMemo 0.5

機能としては、中断時に自動保存機能を追加しました。
これで気軽にメモを中断し、その後、またメモの続きを行うことができます。

HandMemo : かんたん手書きメモ!Androidアプリ1215
http://octoba.net/archives/20101129-handmemo-android-1215.html