2019/9時点、MacOSX でAndroid 開発する場合、Java 8 が必要 ライセンスの関係上 Oracleにユーザ登録する必要があるが、Homebrew でオープン系でJava8構築することも可能
$ brew tap homebrew/cask-versions
$ brew tap homebrew/cask-versions
$ brew cask install adoptopenjdk8
$ brew cask install corretto8
$ brew cask install zulu8
Java のバージョンを複数管理したい場合は jEnvを利用する *Android開発だけならば必要はない
$ git clone https://github.com/gcuisinier/jenv.git ~/.jenv
.bash_profileもしくは .bashrc に環境変数を設定
export PATH="$HOME/.jenv/bin:$PATH"
eval "$(jenv init -)"
$ jenv versions
* system (set by /Users/yoo/.jenv/version)
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
1.8.0_221, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home
もろもろツールをインストールするためにXcodeをインストールして起動済みにしておく
2019/09/25時点でライセンスの関係上、Oracleからインストーラをダウンロードするか、Homebrew と cask でインストールすることになる。
Java SE Downloadsからインストールする場合にユーザ登録が必要
インストーラを利用せず、Homebrew で構築することも可能 Java8 を HomebrewとjEnvで構築
Gradle は オープンソースのビルドシステム Android Studio を利用するときに便利
<
h2 class="h2">Kotlinインストール
AVD Manager から仮装端末をインストール
SDK Manager で不足しているツールをインストールする
SDK Platforms で利用したい Android OSバージョンをインストール
Android 9.0 の場合 - Android SDK Platform 28 - Sources For Android 28 - Google APIs Intel x86 Atom_64 System Image
Android StudioがPreview版のまま放置していたので、今更ながら環境再構築 Eclipceベースでインストールするのと比べて格段に楽になってます!
Java JDKはOSXを最新にしていれば、自動インストールされる
http://developer.android.com/sdk/index.html
次にインストール・起動後、SDKの選択場所が問われるので、SDKを用意する
http://developer.android.com/sdk/installing/index.html?pkg=tools
SDKをダウンロード&解凍後、任意のディレクトリに移動して「Android Studio OSX」起動後に選択する。
例)/Users/ユーザ/Library/Android/android-sdk-macosx/
「Android Studio」で「Android SDK Manager」を起動
Tools、API、Extraなど必要な物を選択してインストール
この辺は作成するアプリ、OSバージョン、端末環境によって異なるので臨機応変に。
Licenseに同意する必要があるので、ある程度一気にインストールした方が楽かもしれない。
ちなみに、前のプロジェクトをインポートしたら日本語が文字化けした。 というより、Android Studioからgradleビルドになったため、build.gradleファイルに以下を記述する必要があるようだ。 [java] tasks.withType(Compile) { options.encoding = 'UTF-8' } [/java]
ServiceでTimer を動かすでServiceを利用してタイマーを動かしたが、handlerを利用して実行する事もできるみたいなのでメモ。
ストップウォッチの要領で動作します。 [java] timer = new Timer("timer task", true); timer.schedule(new TimerTask(){ @Override public void run() { handler.post( new Runnable() { public void run() { lapTime += 0.01f; DecimalFormat decimalFormat = new DecimalFormat("0.00"); BigDecimal decimal = new BigDecimal(lapTime); float outputValue = decimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue(); timeTextView.setText(decimalFormat.format(outputValue)); } }); } }, 10, 10); [/java]
[java] new Timer("タスク名", true); [/java] のtrueはデーモンスレッドで実行します。
久々にAndroid x Eclipseを使って、アップデートしたらコード補完ができなくなりました。
ネットで調べて、新規インストールしたEclipseでコード補完候補が出なくなってしまった場合の対処法 を参考にしました。
結論を言うと
・.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs を開く ・content_assist_disabled_computersを無効にする
人によっては、OSXのショートカットとバッティングしてしまうので、ショートカットを変更します。
環境設定... > General > Keys を開き、Content Assist にショートカットを割り当てます。
ここを参考にメモ
- true
- true
フルスクリーンにして消します。
- @null
[java] public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.game); } [/java]
[java] public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.game); } [/java]
レイアウト系なので何となく設定で消したいですが、条件に合わせて表示する事があればプログラムですかね? ただ、プログラムで消した方が作業は早いか(?!)
久々に、Eclipseを開いたら Androidプロジェクトがビルドできない。 原因は自分はDeveloperフォルダに Android SDKを入れていたので、Xcode のアップデートをした時に根こそぎ削除された事によるもの。 (OSX も Lion にしたのもあるか?)
幸いゴミ箱を空にしなかったので、Developerフォルダを戻して Eclipseを再起動してみる。 しかし、
Your Project contains error s please fix them before running your application
プロジェクトクリーンしてもダメです。
色々面倒くさそうなので EclipseをHelios から Indigoに、Android SDKも最初からセットアップする事に。 しかし、それでも解決しない。 こうなると何かの設定が残ってるしか考えられないので調べたら、 your applicationエラー の記事を見つけた。 「debug.keystoreの有効期限切れ」が原因で、debug.keystoreを削除するだけだったというオチでした。 感謝。
あと、自分で有効期限設定できるみたいです。 [Android][SDK]祝 Androider1周年
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 1800 -dname "CN=Android Debug,O=Android,C=US"
画面固定の設定を、よく忘れてしまうのでメモ。 Manifest.xml で android:screenOrientation を指定する。
縦固定:android:screenOrientation="portrait" 横固定:android:screenOrientation="landscape"
ZipFile と ZipEntry ~Androidでzipを解凍する を参考に ZIP ファイルを解凍してみる。
ボタンをクリックして、SDカード/パッケージ名/sample.zip ファイルを SDカード/パッケージ名/sample/ に解凍。 ※sample.zip は sample ディレクトリを含むZIP [java] public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
Button zipAcvhiveButton = (Button) findViewById(R.id.zipArchiveButton);
zipAcvhiveButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
String zipfileName = "sample.zip";
String baseDir = Environment.getExternalStorageDirectory().getPath()
+ "/" + v.getContext().getPackageName() + "/";
String zipPath = baseDir + zipfileName;
String sampleDir = baseDir + "sample";
new File(sampleDir).mkdir();
zipArchiveFiles(zipPath, baseDir);
}
});
}
public void zipArchiveFiles(String zipPath, String outputDir)
{
err = 0;
try {
ZipFile zipFile = new ZipFile(zipPath);
Enumeration<? extends ZipEntry> enumeration = zipFile.entries();
while(enumeration.hasMoreElements())
{
ZipEntry zipEntry = enumeration.nextElement();
String outputPath = outputDir + zipEntry.getName();
zipArchiveFile(zipPath, zipEntry.getName(), outputPath);
}
zipFile.close();
}
catch(Exception ex)
{
err = -1;
Log.d( "Err", "" + ex);
}
}
public int err = 0;
public void zipArchiveFile(String zipPath, String file, String outFile)
{
err = 0;
try
{
ZipFile zipFile = new ZipFile(zipPath);
ZipEntry entry = zipFile.getEntry(file);
InputStream inputStream = zipFile.getInputStream(entry);
OutputStream outputStream = new FileOutputStream(outFile);
byte[] buffer = new byte[ 1024 * 4 ];
int r = 0;
while( -1 != ( r = inputStream.read(buffer)) )
{
outputStream.write( buffer, 0, r );
}
outputStream.close();
inputStream.close();
zipFile.close();
}
catch( Exception ex )
{
err = -1;
Log.d( "Err", "" + ex);
}
}
[/java] Android の Zip書き出しは、ちょっと手続きが多いみたいです。
Environment.getExternalStorageDirectory().getPath() で SDカードのパスが取得できる。 zipFile.entries() でZip一覧(ZipEntry を継承したEnumeration)を取得し、ループで1ファイルずつ解凍する。 ちなみに、zipEntry.getName() でファイル名を取得するが、Zip にディレクトリを含む場合はディレクトリを含むパスになる。
sample/xxxx.txt
Zip からの書き出しは ZipFile() で各ファイルパスを指定し、zipFile.getInputStream() でInputStream オブジェクトを取得。
InputStream をループで回し、OutputStream で指定したパスにファイルを書き出す。 ※サンプルの場合、1024 x 4 バイトずつ処理
うーん、もうちょっと簡単にならないのかな? もしかしたら、他の方法もあるかも知れませんが。。。
dispatchKeyEvent をオーバライドすることで、キーイベントを取得できる。 これを利用して、KeyEvent.KEYCODE_BAK (戻るボタンフラグ)を判別して、 親クラスの dispatchKeyEvent をさせなければよいみたいだ。
[java] @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { return true; } } return super.dispatchKeyEvent(event); } [/java]