| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
1,264 バイト追加 、 2021年7月30日 (金) 16:36
==[[Android Tips]]==
[[Android]]| [[Java]]| [[Eclipse]]|
==概要==
===基本===
*[[Android アプリケーション基本]]
===[https://docs.google.com/present/view?id=dfrdwzrx_179f7w9q4ct Android 一連の手順概要]===
*[http://typea.info/blg/glob/2012/11/20-android.html 開発環境構築簡易版]
===インストール===
====[[Android SDKのインストール|SDKのインストール] [SDKのインストール]====*[[Android SDKのインストール|SDKのインストール] [SDKのインストール]
====SDK Manager に APIの一覧が表示されない場合====
*Tools - Options からForce にチェックを入れ、HTTP接続を可能にするにチェックを入れ、[[HTTP]]接続を可能にする
[[File:0161_android_sdk_manager.jpg]]
====[[Android ADT Eclipse プラグイン] [|ADT Eclipse プラグイン]]====*[[Android ADT Eclipse プラグイン] [|ADT Eclipse プラグイン]]
===環境構築手順===
====[http://typea.info/blg/glob/2011/11/ubuntu-android-adt-svn.html UbuntuでADTプラグインインストールエラー]====
*[http://typea.info/blg/glob/2011/11/ubuntu-android-adt-svn.html UbuntuでADTプラグインインストールエラー]
====[[Ubuntu ]] ADBドライバに実機を認識させる====
*[http://typea.info/blg/glob/2011/05/ubuntu-android.html ???? と認識されてしまう解決法]
*[http://typea.info/blg/glob/2014/01/ubuntu-1310-64bit-adtadb-android.html 64bit でADBドライバが利用できない解決法]
==開発環境==
===GAE===
[[http://typea.info/blg/glob/2010/08/android_gae_windows7.html Android (実機) と GAE を連携させるためのデバッグ環境を Windows7 に構築する]]
===SDK ソースコード===
=====[[CentOS 初期設定] [|Gitのインストール(Linux)]]=====
# git clone git://android.git.kernel.org/platform/frameworks/base.git
**[http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=core/java/android;h=67060e03dddf2bb4fc9b98fd9aaf24a5722f7369;hb=HEAD projects / platform/frameworks/base.git / tree]
=====[[Eclipse]]=====
*[http://typea.info/blg/glob/2011/01/android-eclipsesdk.html Eclipse から使用可能にする手順]
===[[Eclipse ]] 3.6.1 のコード補完で固まる対処===
*[http://d.hatena.ne.jp/goriponsoft/20110210/1297305320 Eclipse 3.6のコード補完のフリーズを解消する]
=====以下のパッチをEclipseにあてる以下のパッチを[[Eclipse]]にあてる(解凍して上書き)=====
*[http://adt-addons.googlecode.com/svn/patches/org.eclipse.jdt.core_3.6.1.v_A68_R36x.zip org.eclipse.jdt.core_3.6.1.v_A68_R36x.zip]
==エミュレータ==
http://www.hakkaku.net/articles/20090831-579
*[[XML ]] の manifest/application/activity の属性、android:screenOrientation を、"portrait" に設定すると、縦画面のまま回転しなくなります。
=====設定値=====
if (条件) {
// 画面の回転を抑制(現在の向きに固定)
Configuration config = getResourcesget[[R]]esources().getConfiguration(); if (config.orientation == Configuration.ORIENTATION_PORTRAITOR[[IE]]NTATION_PORTRAIT) { setRequestedOrientation(ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_PORTRAIT); } else if(config.orientation == Configuration.ORIENTATION_LANDSCAPEOR[[IE]]NTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
} else {
// 回転を可能に
setRequestedOrientation(ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
*逆向きにも対応版
* // @see http://stackoverflow.com/questions/2366706/how-to-lock-orientation-during-runtime
int orientation = getActivitygetActi[[vi]]ty().getRequestedOrientation(); int rotation = ((WindowManager) getActivitygetActi[[vi]]ty().getSystemServicegetSystemSer[[vi]]ce( Context.WINDOW_SERVICEWINDOW_SE[[R]]VICE)).getDefaultDisplay().getRotationget[[R]]otation();
switch (rotation) {
case Surface.ROTATION_0[[R]]OTATION_0: orientation = ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
case Surface.ROTATION_90[[R]]OTATION_90: orientation = ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_LANDSCAPE;
break;
case Surface.ROTATION_180[[R]]OTATION_180: orientation = ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
break;
default:
orientation = ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
}
getActivitygetActi[[vi]]ty().setRequestedOrientation(orientation);
*固定解除
setRequestedOrientation(ActivityInfoActi[[vi]]tyInfo.SCREEN_ORIENTATION_UNSPECIFIED);
===画面サイズを取得する===
=====1=====
=====outSizeに格納される=====
Point outSize = new Point();
(WindowManager)getSystemServicegetSystemSer[[vi]]ce(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(outSize);
===画面の向きを取得する===
<blockquote>API Level 8 以降は getRotation get[[R]]otation () を使うこと 0:portrait, 1:landscape</blockquote>
Display display = getWindowManager().getDefaultDisplay();
switch(display.getOrientation()) {
case Surface.ROTATION_90[[R]]OTATION_90: case Surface.ROTATION_270[[R]]OTATION_270:
// TODO
break;
===タイトルバーを非表示に===
=====コード=====
*requestWindowFeature(Window.FEATURE_NO_TITLEFEATU[[R]]E_NO_TITLE)を実行 public class ColorChoiceActivity ColorChoiceActi[[vi]]ty extends Activity Acti[[vi]]ty {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLEFEATU[[R]]E_NO_TITLE);
setContentView([[R]].layout.main);
}
}
=====[[XML]]=====*AndroidManifest[[Android]]Manifest.xml に指定
*タイトルバーを非表示、フルスクリーン
<activity acti[[vi]]ty
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
===最大化表示(ステータスバーを隠す)===
=====コード=====
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREENFLAG_FULLSC[[R]]EEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREENFLAG_FO[[R]]CE_NOT_FULLSC[[R]]EEN);
<blockquote>逆の場合、add と clear を変える</blockquote>
=====[[XML]]=====*AndroidManifest[[Android]]Manifest.xml に指定
*タイトルバーを非表示、フルスクリーン
<activity acti[[vi]]ty
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
===スタイル===
*[[Android スタイル|スタイル] [スタイル]
===色定義を行い使用する ===
=====values/colos.xml を定義=====
</resources>
=====使い方(Activity内Acti[[vi]]ty内)===== txtHoge.setTextColor(getResourcesget[[R]]esources().getColor([[R]].color.lightgrey));
<blockquote>txtHoge.setTextColor([[R]].color.lightgrey) とするのは、色の値として、リソースIDが渡されるためNG</blockquote>
===EditText に最初にフォーカスがあたり、IMEが自動起動してしまうのを抑制===
getWindow().setSoftInputMode(La outParams.SOFT_INPUT_STATE_ALWA S_HIDDEN);
setContentView([[R]].la out.word_editor);
==App ウィジェット==
});
===Activity Acti[[vi]]ty にて戻るボタン押下を検知===
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
new AlertDialog.Builder(parent)
.setTitle([[R]].string.lbl_file_delete_confirm) .setMessage(parent.getResourcesget[[R]]esources().getString([[R]].string.msg_file_delete_confirm, file.getName())) .setPositiveButton([[R]].string.lbl_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton([[R]].string.lbl_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
public void showSortDialog() {
final int[] keys = {
MENU_SORT_BY_TITLEMENU_SO[[R]]T_BY_TITLE, MENU_SORT_BY_HU_LEVEL_ASCMENU_SO[[R]]T_BY_HU_LEVEL_ASC, MENU_SORT_BY_HU_LEVEL_DSCMENU_SO[[R]]T_BY_HU_LEVEL_DSC, MENU_SORT_BY_CREATE_DATEMENU_SO[[R]]T_BY_C[[R]]EATE_DATE
};
final String[] items = {
this.getString([[R]].string.lbl_sort_by_title), this.getString([[R]].string.lbl_sort_by_hu_level_asc), this.getString([[R]].string.lbl_sort_by_hu_level_dsc), this.getString([[R]].string.lbl_sort_by_create_date)
};
new AlertDialog.Builder(this)
.setTitle([[R]].string.lbl_sort)
.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
}
})
.setNegativeButton([[R]].string.lbl_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Dialog dialog = new Dialog(mContext);
dialog.setContentView([[R]].layout.custom_dialog);
dialog.setTitle("Custom Dialog");
TextView text = (TextView) dialog.findViewById([[R]].id.text);
dialog.show();
==ActivityActi[[vi]]ty==
===同じアプリケーションのアクティビティを呼び出す===
=====マニフェストファイルの application セクションの中に以下を記述=====
<activity acti[[vi]]ty android:name=".OtherActivityOtherActi[[vi]]ty"/>
=====インテントを利用して呼び出し=====
Intent intent = new Intent(getApplicationContext(),
             OtherActivity             OtherActi[[vi]]ty.class); startActivitystartActi[[vi]]ty(intent);
<blockquote>データの受け渡しには、Intent.putExtra を利用</blockquote>
=====ActivityActi[[vi]]ty.onCreate ===== Spinner spFontSize = (Spinner) findViewById([[R]].id.spn_font_size);
ArrayAdapter<CharSequence> spFontSizeAdapter
= ArrayAdapter.createFromResourcecreateFrom[[R]]esource(this, [[R]].array.ary_font_size, android.[[R]].layout.simple_spinner_item); spFontSizeAdapter.setDropDownViewResourcesetDropDownView[[R]]esource(android.[[R]].layout.simple_spinner_dropdown_item);
spFontSize.setAdapter(spFontSizeAdapter);
===[http://typea.info/blg/glob/2010/09/androidx06ht-desire-activity-activity.html Activity の状態を一時的に保存する]===
[[http://typea.info/blg/glob/2010/09/androidx06ht-desire-activity-activity.html Activity の状態を一時的に保存する]]
===[http://android.siprop.org/index.php?%CA%D9%B6%AF%B2%F1%2FAndroid%20SDK%20WG%20%C2%E81%B2%F3%20%A5%BB%A5%C3%A5%B7%A5%E7%A5%F3%A1%CA2008.10.25%A1%CB コンフィグレーション]===
*デバイスのコンフィグレーションが変更されたら、UIはそのコンフィグレーションにマッチするように更新する必要があるため、Activitiは再スタートされるデバイスのコンフィグレーションが変更されたら、UIはそのコンフィグレーションにマッチするように更新する必要があるため、Acti[[vi]]tiは再スタートされる*コンフィグレーションの変更があってもActivityの再スタートを避けたい場合、マニフェストにandroidコンフィグレーションの変更があってもActi[[vi]]tyの再スタートを避けたい場合、マニフェストにandroid:configChanges属性を追加
android:configChanges="locale|orientation|"
===[http://typea.info/blg/glob/2010/09/android-arrayadapter.html ArrayAdapter に ラジオボタンを置く]===
[[http://typea.info/blg/glob/2010/09/android-arrayadapter.html ArrayAdapter に ラジオボタンを置く]]
===TabActivityTabActi[[vi]]ty(タブによるアクティビティ切り替え) サンプル===[[http://typea.info/blg/glob/2010/11/android-tabactivity.html TabActivity]]===ListActivityListActi[[vi]]ty(リスト表示画面)サンプル===[[Android スケルトン ListActivity]] [[|ListActivity]]===PreferenceActivityPreferenceActi[[vi]]ty(設定画面の作成) サンプル===[[http://typea.info/blg/glob/2010/10/android-android-hacks.html PreferenceActivity]]===透明なActivityを作成する透明なActi[[vi]]tyを作成する===*http://stackoverflow.com/questions/2176922/how-to-create-transparent-activityacti[[vi]]ty-in-android
====res/values/styles.xml に以下の内容を記述====
<?xml version="1.0" encoding="utf-8"?>
</style>
</resources>
====AndroidManifest[[Android]]Manifest.xml のActivityのtheme属性にに以下の記述==== <activity acti[[vi]]ty android:name=".EditScoreActivityEditScoreActi[[vi]]ty" android:theme="@style/Theme.Transparent"></activityacti[[vi]]ty>
===Activity Acti[[vi]]ty をダイアログとして表示する===
*@android:style/Theme.Dialog を利用
<activity acti[[vi]]ty android:name=".EditScoreActivityEditScoreActi[[vi]]ty" android:theme="@android:style/Theme.Dialog"></activityacti[[vi]]ty>==ServiceSer[[vi]]ce=====[[Android Service|Service] [Service]===
==Fragment==
*[[Android Fragment|Fragment] [Fragment]
===サポートライブラリ(android.support.v4)でFragmentを利用する場合の注意点===
*android.support.v4 のクラスを利用する
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivityFragmentActi[[vi]]ty;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view[[vi]]ew.PagerAdapter; import android.support.v4.view[[vi]]ew.ViewPager;*Activity ではなく、FragmentActivityを利用するActi[[vi]]ty ではなく、FragmentActi[[vi]]tyを利用する
*getFragmentManager() ではなく、getSupportFragmentManager() を利用する
*invalidateOptionsMenuinvalidateOptions[[Menu]]() ではなく、supportInvalidateOptionsMenuではなく、supportInvalidateOptions[[Menu]]() を利用する
==非同期処理==
*[http://typea.info/blg/glob/2014/02/android-asynctask.html AsyncTaskを使う]
===ListView の分離線を変更する===
====XMLから[[XML]]から====
<ListView android:id="@+id/android:list"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:dividerdi[[vi]]der="#D7D7D7" android:dividerHeightdi[[vi]]derHeight="1px">
</ListView>
====コードから====
ListView lv = getListView();
lv.setDividersetDi[[vi]]der(new ColorDrawable(Color.GREEN)); lv.setDividerHeightsetDi[[vi]]derHeight(1);
===ListViewのID===
*[http://typea.info/blg/glob/2012/02/android-8.html ListViewのスクロールバーを大きくする]
===ListViewのコンテキストメニュー選択時にアイテムを取り出す===
[[http://typea.info/blg/glob/2012/02/android-8.html ListViewのコンテキストメニュー選択時にアイテムを取り出す]]
===カスタムViewを利用する===
*http://developer.android.com/guide/topics/ui/custom-components.html
<view [[vi]]ew xmlns:android="http://schemas.android.com/apk/res/android"
class="info.typea.iromegane.ColorTile"
android:id="@+id/col_tile" ></view[[vi]]ew>
===カスタムViewを作成しレイアウトはXMLで行うカスタムViewを作成しレイアウトは[[XML]]で行う===
public class HogeView extends LinearLayout {
LayoutInflater layoutInflater
= (LayoutInflater)context.getSystemServicegetSystemSer[[vi]]ce(Context.LAYOUT_INFLATER_SERVICE);
View view [[vi]]ew = layoutInflater.inflate(R.layout.hoge_layout, this);
}
}
===ページめくり===
[[http://typea.info/blg/glob/2010/07/androidx06ht_desire_2.html ページをめくるサンプル]]
===Spinnerの使い方例===
</string-array>
=====ActivityActi[[vi]]ty=====
// フォントサイズ
spFontSize = (Spinner) findViewById([[R]].id.spn_font_size);
ArrayAdapter<CharSequence> spFontSizeAdapter
= ArrayAdapter.createFromResourcecreateFrom[[R]]esource(this, [[R]].array.ary_font_size, android.[[R]].layout.simple_spinner_item); spFontSizeAdapter.setDropDownViewResourcesetDropDownView[[R]]esource(android.[[R]].layout.simple_spinner_dropdown_item);
spFontSize.setAdapter(spFontSizeAdapter);
spFontSize.setPrompt(getResourcesget[[R]]esources().getText([[R]].string.lbl_font_size));
for (int i=0; i<spFontSize.getCount(); i++) {
*[http://typea.info/blg/glob/2010/07/android-x06ht-desire-1.html 入力ダイアログ、確認ダイアログを共通化]
==検索==
===[[Android 検索インターフェースの作成|検索インターフェースの作成] [検索インターフェースの作成]=====ContentProviderContentPro[[vi]]der==
===連絡先の取得と電話をかける===
*[http://typea.info/blg/glob/2010/06/androidx06ht-desire-1.html Android(X06HT Desire) 連絡先の取得と電話をかけるサンプル]
==レイアウト==
===XMLからレイアウトをインスタンス化する[[XML]]からレイアウトをインスタンス化する========SystemService SystemSer[[vi]]ce を直接===== LayoutInflater [[vi ]] = (LayoutInflater)getSystemServicegetSystemSer[[vi]]ce(Context.LAYOUT_INFLATER_SERVICE);
prevView = [[vi]].inflate(R.layout.layout_previouslayout_pre[[vi]]ous,null); currentView = [[vi]].inflate(R.layout.layout_current,null); nextView = [[vi]].inflate(R.layout.layout_next,null);
=====SystemService SystemSer[[vi]]ce を View経由===== EditText editor = (EditText) View.inflate(this, [[R]].layout.editor_lined, null);
===スクロールさせる===
</LinearLayout>
==インテント==
===暗黙的 Intent で [[Twitter ]] や Evernote と連携する===
*[http://typea.info/blg/glob/2011/02/android-intent-twitter-evernote.html 暗黙的 Intent で Twitter や Evernote と連携す]
===テキストエディタ等にファイルの処理をさせる===
=====setDataAndType を使って、ファイルのURIとMIMEタイプを同時に渡すを使って、ファイルのU[[R]]IとMIMEタイプを同時に渡す=====<blockquote>個別に渡すと後に渡した方しか有効にならない(バグ?仕様 Android2[[Android]]2.1 X06HT)</blockquote>
File f = new File(path);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEWACTION_V[[IE]]W);
intent.setDataAndType(Uri.fromFile(f),"text/plain");
startActivitystartActi[[vi]]ty(intent);
===画像ファイルを共有する===
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAMEXT[[R]]A_ST[[R]]EAM, Uri.fromFile(file)); startActivitystartActi[[vi]]ty(Intent.createChooser(intent, "title"));
===ブラウザを開くなどURIの処理を行うブラウザを開くなどU[[R]]Iの処理を行う===
Uri uri = Uri.parse("https://market.android.com/details?id=info.typea.eitangoroid.pro");
Intent intent = new Intent(Intent.ACTION_VIEWACTION_V[[IE]]W, uri); context.startActivitystartActi[[vi]]ty(intent);
===ブロードキャストされたインテントを受け取る===
*http://typea.info/blg/glob/2013/07/-android-001.html
==ノーティフィケーション==
===起動しているActivityを全面に表示させる起動しているActi[[vi]]tyを全面に表示させる===
*http://blog.livedoor.jp/ss_9/archives/1745734.html?ignore_lite
=====AndroidManifest[[Android]]Manifest.xml=====*android:launchMode="singleTop" を指定。指定しないと別のActivityが生成されてしまう。を指定。指定しないと別のActi[[vi]]tyが生成されてしまう。 <activity acti[[vi]]ty android:name=".TimeKeeperActivityTimeKeeperActi[[vi]]ty"
android:launchMode="singleTop">
:
=====インテントを設定し、通知を行う=====
Notification notification = new Notification([[R]].drawable.icon,
text, System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivitygetActi[[vi]]ty(this, 0, Intent(this, TimeKeeperActivityTimeKeeperActi[[vi]]ty.class), 0); notification.setLatestEventInfo(this, getString([[R]].string.msg_section_alarm),
text, contentIntent);
notifManager.notify([[R]].string.app_name, notification);
==メニュー==
===[[Android ]] 規定のアイコンを設定===
@Override
public boolean onCreateOptionsMenuonCreateOptions[[Menu]]([[Menu ]] menu) { super.onCreateOptionsMenuonCreateOptions[[Menu]](menu); menu.add(0, MENU_ADD_NEW, 0, [[R]].string.menu_add_new_item) .setIcon(android.[[R]].drawable.ic_menu_add);
return true;
}
===ListView に コンテキストメニュー(長押し)を設定===
public class SampleListActivity SampleListActi[[vi]]ty extends ListActivity ListActi[[vi]]ty { private static final int MENU_EDIT = [[Menu]].FIRST;
@Override
public void onCreate(Bundle savedInstanceState) {
:
// 忘れがち
registerForContextMenuregisterForContext[[Menu]](getListView());
}
@Override
public void onCreateContextMenuonCreateContext[[Menu]](ContextMenu Context[[Menu]] menu, View v, ContextMenuInfo Context[[Menu]]Info menuInfo) {
super.onCreateContextMenuonCreateContext[[Menu]](menu, v, menuInfo); menu.add(0, MENU_EDIT, 0, [[R]].string.menu_edit);
}
@Override
public boolean onContextItemSelected(MenuItem [[Menu]]Item item) {
switch(item.getItemId()) {
case MENU_EDIT:
==パーミッション==
*http://developer.android.com/reference/android/Manifest.permission.html
===[[Android パーミッション]]===
==assetリソース==
===assetリソースディレクトリのファイルを読む===
continue;
}
BufferedReader Buffered[[R]]eader reader = new BufferedReaderBuffered[[R]]eader(new InputStreamReaderInputStream[[R]]eader(zin));
String line = null;
while ((line = reader.readLine()) != null) {
}
==文字列リソース==
===書式設定でXMLエラーとなる書式設定で[[XML]]エラーとなる===フォーマットを行う場合、複数の%が含まれたりすると、Multiple annotations found at this エラーで、XMLが解析されないエラーで、[[XML]]が解析されない
*http://stackoverflow.com/questions/4414389/android-xml-percent-symbol
=====コード例=====
String text = getContext().getString([[R]].string.msg_location_msg,
location.getLatitude(),
location.getLongitude());
File targetdir = getFilesDir();
===SDカードがマウントされているか判定===
if (EnvironmentEn[[vi]]ronment.MEDIA_MOUNTED.equals(EnvironmentEn[[vi]]ronment.getExternalStorageState())) {
// マウントされている
}
===SDカードへ保存===
=====パーミッション=====
android.permission.WRITE_EXTERNAL_STORAGEW[[R]]ITE_EXTE[[R]]NAL_STO[[R]]AGE
=====対象ディレクトリの取得=====
File targetdir = EnvironmentEn[[vi]]ronment.getExternalStorageDirectory();
==データベース==
===コマンドラインからSQLを発行コマンドラインから[[SQL]]を発行===*http://typea.info/blg/glob/2012/01/android-[[sqlite]]-sql.html
**エミュレータを使用する
**コマンドプロンプトのフォントおよび文字コードを変更するコマンドプロンプトのフォントおよび[[文字コード]]を変更する
C:\Users\piroto>adb shell
# cd /data/data/info.typea.eitangoroid.pro/databases
# ls
ls
webviewCacheweb[[vi]]ewCache.db
FlippadDB
webviewweb[[vi]]ew.db # sqlite3 [[sqlite]]3 FlippadDB sqlite3 [[sqlite]]3 FlippadDB SQLite [[SQL]]ite version 3.6.22
Enter ".help" for instructions
Enter [[SQL ]] statements terminated with a ";"
==画像==
===ビットマップのサイズ変更===
=====画面中央に文字列描画=====
Paint paint = new Paint();
paint.setARGBsetA[[R]]GB(60, 80, 80, 80); paint.setTextAlign(Paint.Align.CENTERCENTE[[R]]);
paint.setTextSize(80);
paint.setTypeface(Typeface.DEFAULT_BOLD);
====文字列領域の高さにより、フォントサイズを決定する====
Paint txtPaint = new Paint();
txtPaint.setTextAlign(Paint.Align.CENTERCENTE[[R]]);
txtPaint.setStyle(Paint.Style.FILL);
txtPaint.setAntiAlias(true);
===Bitmap===
====リソースからBitmapを生成し、カラーフィルターをかけてCanvasに描画====
Bitmap bmpConfig = BitmapFactory.decodeResourcedecode[[R]]esource(getResourcesget[[R]]esources(), [[R]].drawable.config);
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(Color.GREENG[[R]]EEN,Mode.SRC_INS[[R]]C_IN));
float bmpConfigTop = blindTop + iconMargin;
canvas.drawBitmap(bmpConfig, 0 ,bmpConfigTop, paint);
==デバッグ==
===テスト===
*[[Android Activity の テスト] [|Activity の テスト]]
*[http://typea.info/blg/glob/2011/01/android-eclipse.html Activity の テスト2]
===実機でデバッグ===
*[http://typea.info/blg/glob/2010/09/android-x06ht-desire-windows-xp-adb.html Windows XP にてADBドライバを認識しない場合の対応]
*AndroidManifest[[Android]]Manifest.xml Debuggable = true
===UbuntuでデバイスIDが[[Ubuntu]]でデバイスIDが????と表示され実機デバッグできない===
[[File:0158_android-sdk07.png]]
*http://developer.android.com/guide/developing/devicede[[vi]]ce.html#setting-up*http://developer.android.com/guide/developing/devicede[[vi]]ce.html#VendorIds
=====51-android.rulesを作成=====
$ cd /etc/udev/rules.d/
$ sudu su
# [[vi ]] 51-android.rules
=====HTCを登録=====
SYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
====確認====
*対応前
# ./adb devicesde[[vi]]ces List of devices de[[vi]]ces attached
???????????? no permissions
*対応後
# ./adb devicesde[[vi]]ces List of devices de[[vi]]ces attached HT061PL00290 devicede[[vi]]ce
[[File:0159_android-sdk08.png]]
*TraceView を実行
C:\work>cd C:\Programs\android-sdk-windows\tools
C:\Programs\android-sdk-windows\tools>traceview trace[[vi]]ew c:\work\test.trace{{ref_image trace[[File:0163_traceview01vi]]ew01.jpg]]}}
===スクリーンキャプチャ===
*[[Android Eclipse から スクリーンキャプチャを取る]]
===カメラアプリで、FileNotFoundException===
*http://www.bpsinc.jp/blog/archives/date/2010/05/08
public void onClick(View v) {
// ボタンを押したら、ソフウェアキーボードを消す
InputMethodManager imm = (InputMethodManager)getSystemServicegetSystemSer[[vi]]ce(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
*[http://typea.info/blg/glob/2010/05/android-1.html エミュレータのセンサーの値を取得してみる]
*[http://typea.info/blg/glob/2010/06/androidx06ht-desire.html Android(X06HT Desire) 搭載センサーの値を取得してみる]
===GPS(緯度・経度)===
*[https://www.typea.info/blog/index.php/2011/03/30/android_gps_1/ Android GPS(位置情報) を使うための準備(1)]
*https://www.typea.info/materials/android_a_yan_no1.pdf 使用例]
==バイブレーター==
=====宣言=====
private Vibrator vib[[vi]]b;
=====初期化=====
vib [[vi]]b = (Vibrator) getContext().getSystemServicegetSystemSer[[vi]]ce(Context.VIBRATOR_SERVICE);
=====利用=====
vib[[vi]]b.vibrate[[vi]]brate(50L);
=====パーミッション=====
<uses-permission android:name="android.permission.VIBRATEVIB[[R]]ATE"></uses-permission>
*カメラデバイスは向きを認識していないので、指定する必要がある
Camera.Parameters p = camera.getParameters();
p.setRotationset[[R]]otation(90);
camera.setParameters(p);
*[http://typea.info/blg/glob/2010/06/androidx06ht_desire_1.html サンプルソース]
*ハードウェアから、音量を制御させるには、以下の記述が必要
setVolumeControlStream(AudioManager.STREAM_MUSICST[[R]]EAM_MUSIC);
===サウンドモードを判定する===
audioManager = (AudioManager)getSystemServicegetSystemSer[[vi]]ce(Context.AUDIO_SERVICE); switch (audioManager.getRingerModeget[[R]]ingerMode()) { case AudioManager.RINGER_MODE_SILENT[[R]]INGE[[R]]_MODE_SILENT:
break;
case AudioManager.RINGER_MODE_VIBRATE[[R]]INGE[[R]]_MODE_VIB[[R]]ATE:
break;
case AudioManager.RINGER_MODE_NORMAL[[R]]INGE[[R]]_MODE_NO[[R]]MAL:
player.seekTo(0);
player.start();
super.onCreate();
powerManager = (PowerManager)getSystemServicegetSystemSer[[vi]]ce(POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCKSC[[R]]EEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUPACQUI[[R]]E_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASEON_AFTE[[R]]_[[R]]ELEASE, ClockServiceClockSer[[vi]]ce.class.getName()); keyguardManager = (KeyguardManager) getSystemServicegetSystemSer[[vi]]ce(KEYGUARD_SERVICE); keyguardLock = keyguardManager.newKeyguardLock(ClockServiceClockSer[[vi]]ce.class.getName());
}
=====必要なパーミッション=====
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARDDISABLE_KEYGUA[[R]]D"/>
#/res/anim フォルダを作成
#anim フォルダでコンテキストメニューから import し適用
ViewFlipper vf = (ViewFlipper) findViewById([[R]].id.details); vf.setAnimation(AnimationUtils.loadAnimation(this, [[R]].anim.push_left_in));
==Web==
===Httpクライアントタイムアウトを設定する===
[[http://typea.info/blg/glob/2010/09/android-http.html Httpクライアントタイムアウトを設定する]]
HttpPost HttpGet = new HttpGet(uri);
HttpParams httpParms = new BasicHttpParams();
DefaultHttpClient client = new DefaultHttpClient(httpParms);
HttpResponse Http[[R]]esponse response = client.execute(httpPost);
===MIMEマルチパートでファイルをアップロードする===
parms.add(new BasicNameValuePair("lat", this.lat));
parms.add(new BasicNameValuePair("lng", this.lng));
post.setEntity(new UrlEncodedFormEntity(parms, [[HTTP]].UTF_8));
:
} catch (UnsupportedEncodingException e) {
parms.add(new BasicNameValuePair("lon", String.valueOf(loc.getLongitude())));
parms.add(new BasicNameValuePair("message", msg));
post.setEntity(new UrlEncodedFormEntity(parms, [[HTTP]].UTF_8));
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse Http[[R]]esponse response = httpClient.execute(post);
InputStream in = response.getEntity().getContent();
BufferedReader Buffered[[R]]eader reader = new BufferedReaderBuffered[[R]]eader(new InputStreamReaderInputStream[[R]]eader(in));
String l = null;
while((l = reader.readLine()) != null) {
==NDK==
*[http://typea.info/blg/glob/2012/02/android-ndk.html ネイティブライブラリを利用するため NDK を設定する]
==[[Google App Engine]]==
===開発環境の構築===
*[http://typea.info/blg/glob/2010/08/android-gae-windows7.html Android (実機) と GAE を連携させるためのデバッグ環境を Windows7 に構築]
===[[Google ]] アカウントの利用===
*[http://typea.info/blg/glob/2010/08/android_google_gae.html Android アプリから Google アカウントを利用して GAE アプリケーションを利用する]
*[http://typea.info/blg/glob/2010/09/android-gae.html Android アプリから、GAE 開発サーバーのアカウントを利用]
===画像===
====読み込み・キャッシュ====
*https://github.com/nostra13/[[Android]]-Universal-Image-Loader
==広告==
===[[Android AdMob|AdMob] [AdMob]===**[[Android AdMob|AdMob] [AdMob]
==公開==
===[[Android ]] マーケット===
*[http://typea.info/blg/glob/2010/07/android-1.html Android マーケットに開発者登録]
===SDカードにインストールを許可===
*AndroidManifest[[Android]]Manifest.xml に installLocation を指定 (Android ([[Android]] SDK 2.2から対応)
android:installLocation="auto"
以下の様なエラーがでて実行できない
Your project contains error(s), please fix them before running your application.
Description Resource [[R]]esource Path Location Type
Error generating final archive: java.io.FileNotFoundException: C:\Users\piroto\workspace\EitangoroidPro\bin\resources.ap_ does not exist
http://www.yukun.info/blog/2012/01/android-eclipse-build-error.htmlを参考に以下の手順で解決
*Window - [[Android ]] SDK Manager から、インストール済みのSDKを最新にUpdate
*eclipse.exe -clean を実行
===[[Android ]] requires compiler compliance level 5.0 or 6.0. Found '1.4' instead === [[Android ]] requires compiler compliance level 5.0 or 6.0. Found '1.4' instead. Please use [[Android ]] Tools > Fix Project Properties.*プロジェクトのプロパティから、Java プロジェクトのプロパティから、[[Java]] Compiler
*Compiler compliance level を 1.6 等 適切なものに
*[[Android ]] Tools > Fix Project Properties
*リビルド

案内メニュー