More Related Content Similar to 2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa Similar to 2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa (20) More from Keiji Ariyama (7) 2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa20. API Level
20
バージョン API Level バージョンコード
6.0 23 M
5.1 22 Lollipop_MR1
5.0 21 Lollipop
4.4W 20 KitKat for Wearables Only
4.4 19 KITKAT
4.3 18 JELLY_BEAN_MR2
4.2 - 4.2.2 17 JELLY_BEAN_MR1
4.1 - 4.1.1 16 JELLY_BEAN
21. API Level
21
バージョン API Level バージョンコード
4.0.3, 4.0.4 15 ICE_CREAM_SANDWICH_MR1
4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH
3.2 13 HONEYCOMB_MR2
3.1.x 12 HONEYCOMB_MR1
3.0.x 11 HONEYCOMB
2.3.3, 2.3.4 10 GINGERBREAD_MR1
2.3 - 2.3.2 9 GINGERBREAD
31. public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE = 0x1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar ab = getSupportActionBar();
ab.setIcon(R.mipmap.ic_launcher);
getSupportFragmentManager()
.beginTransaction()
.add(R.id.content, SettingFragment.newInstance(),
SettingFragment.class.getSimpleName())
.commit();
}
}
Fragmentを使うには
44. Google Play Services
44
• Google Adwords
• Google Fit
• Play Games API
• Location API
• Panorama API
• NearBy
• Google Plus
• Vision (顔認識・バーコード認識)
• Google Wallet
• Wearable
67. Android Studio
67
Google I/O 2013で発表
2015年にバージョン1.0がリリース
チェコJetBRAINS社が開発している
「IntelliJ IDEA Community Edition」
がベース
ビルドシステムは「Grade」
Android plugin for Gradle でAndroid
アプリのビルドに対応している
82. NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentTitle(context.getText(R.string.new_android_studio))
.setContentText(context.getText(R.string.new_android_studio_version_available))
.setTicker(context.getText(R.string.new_android_studio_version_available))
.setPriority(NotificationCompat.PRIORITY_MAX)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setSmallIcon(R.mipmap.ic_launcher)
.setDefaults(Notification.DEFAULT_VIBRATE);
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(builder)
.setBigContentTitle(context.getText(R.string.new_android_studio_version_available));
for (UpdateState.Product.Channel channel : updatedChannelList) {
UpdateState.Product.Channel.Build build = channel.builds.get(0);
inboxStyle.addLine(String.format(Locale.US, "%s in %s channel.n",
build.version, channel.status));
}
NotificationManager nm
= (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
nm.notify(NOTIFICATION_ID, builder.build());
NotificationCompat(support.v4)
82
95. public class MainActivity extends AppCompatActivity {
public static final int REQUEST_CODE = 0x1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar ab = getSupportActionBar();
ab.setIcon(R.mipmap.ic_launcher);
}
}
findViewById
96. public class MainActivity extends AppCompatActivity
implements SeekBar.OnSeekBarChangeListener {
private Button buttonPushMe;
private ImageView imageAndroid;
private SeekBar seekBarRed;
private SeekBar seekBarGreen;
private SeekBar seekBarBlue;
ButterKnife
http://jakewharton.github.io/butterknife/
97. @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonPushMe = (Button) findViewById(R.id.btn_pushme);
buttonPushMe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonPushMe.setText("ボタンが押されました!");
imageAndroid.setImageResource(R.drawable.droid2);
}
});
imageAndroid = (ImageView) findViewById(R.id.iv_android);
seekBarRed = (SeekBar) findViewById(R.id.sb_red);
seekBarRed.setOnSeekBarChangeListener(this);
seekBarGreen = (SeekBar) findViewById(R.id.sb_green);
seekBarGreen.setOnSeekBarChangeListener(this);
seekBarBlue = (SeekBar) findViewById(R.id.sb_blue);
seekBarBlue.setOnSeekBarChangeListener(this);
}
ButterKnife
http://jakewharton.github.io/butterknife/
98. public class MainActivity extends AppCompatActivity
implements SeekBar.OnSeekBarChangeListener {
@Bind(R.id.iv_android)
ImageView imageAndroid;
@Bind(R.id.sb_red)
SeekBar seekBarRed;
@Bind(R.id.sb_green)
SeekBar seekBarGreen;
@Bind(R.id.sb_blue)
SeekBar seekBarBlue;
ButterKnife
http://jakewharton.github.io/butterknife/
99. @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
seekBarRed.setOnSeekBarChangeListener(this);
seekBarGreen.setOnSeekBarChangeListener(this);
seekBarBlue.setOnSeekBarChangeListener(this);
}
ButterKnife
http://jakewharton.github.io/butterknife/
100. public class MainActivity extends AppCompatActivity
implements SeekBar.OnSeekBarChangeListener {
@Bind(R.id.btn_pushme)
Button buttonPushMe;
@OnClick(R.id.btn_pushme)
public void onClick(View v) {
buttonPushMe.setText("ボタンが押されました!");
imageAndroid.setImageResource(R.drawable.droid2);
}
ButterKnife
http://jakewharton.github.io/butterknife/
102. public class DbHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "user-data.db";
private static final int DB_VERSION = 1;
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
private static final String CREATE_USER_TABLE = "CREATE TABLE users (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name TEXT," +
"gender INTEGER," +
"megane INTEGER" +
");";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
SQLite
103. ContentValues values1 = new ContentValues();
values1.put("name", "Claudia Madobe");
values1.put("gender", 0);
values1.put("megane", 1);
ContentValues values2 = new ContentValues();
values2.put("name", "Claude Madobe");
values2.put("gender", 1);
values2.put("megane", 1);
SQLiteDatabase db = new DbHelper(this).getWritableDatabase();
db.beginTransaction();
Log.d(TAG, "id = " + db.insert("users", null, values1));
Log.d(TAG, "id = " + db.insert("users", null, values2));
db.setTransactionSuccessful();
db.endTransaction();
Cursor cursor = db.query("users", new String[]{"name", "megane"},
"gender = ? AND megane = ?", new String[]{"0", "1"},
null, null, null);
Log.d(TAG, "count = " + cursor.getCount());
while (cursor.moveToNext()) {
Log.d(TAG, "name = " + cursor.getString(cursor.getColumnIndex("name")));
}
SQLite
105. public class User {
public static final int GENDER_FEMALE = 0;
public static final int GENDER_MALE = 1;
private long id;
private String name;
private int gender = GENDER_FEMALE;
private boolean megane = true;
public long save(SQLiteDatabase db) {
ContentValues values = new ContentValues();
values.put("name", name);
values.put("gender", gender);
values.put("megane", megane ? 1 : 0);
return db.insert("users", null, values);
}
// アクセサ省略
}
Userクラス
106. public class User extends RealmObject {
@Ignore
public static final int GENDER_FEMALE = 0;
@Ignore
public static final int GENDER_MALE = 1;
private long id;
private String name;
private int gender = GENDER_FEMALE;
private boolean megane = true;
// アクセサ省略
}
Realm
https://realm.io
107. Realm realm = Realm.getInstance(this);
realm.beginTransaction();
User user = realm.createObject(User.class);
user.setName("Claudia Madobe");
user.setGender(User.GENDER_FEMALE);
user.setMegane(true);
user = realm.createObject(User.class);
user.setName("Claude Madobe");
user.setGender(User.GENDER_MALE);
user.setMegane(true);
realm.commitTransaction();
RealmResults<User> result = realm.where(User.class)
.equalTo("gender", User.GENDER_FEMALE)
.equalTo("megane", true)
.findAll();
Log.d(TAG, "count = " + result.size());
for (User userData : result) {
Log.d(TAG, "name = " + userData.getName());
}
Realm
https://realm.io
110. {
"users" : [
{
"name" : "Claudia Madobe",
"gender" : 0,
"megane" : true
},
{
"name" : "Claude Madobe",
"gender" : 1,
"megane" : true
}
]
}
JSONObject
111. List<User> userList = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(JSON);
JSONArray users = jsonObject.getJSONArray("users");
for (int i = 0; i < users.length(); i++) {
JSONObject userJson = users.getJSONObject(i);
User user = new User();
user.setName(userJson.getString("name"));
user.setGender(userJson.getInt("gender"));
user.setMegane(userJson.getBoolean("megane"));
userList.add(user);
}
Log.d(TAG, "count = " + userList.size());
for (User userData : userList) {
Log.d(TAG, "name = " + userData.getName());
}
} catch (JSONException e) {
}
JSONObject
112. 実行結果
count = 1
name = Claudia Madobe
name = Claude Madobe
JSONObject
{
"users" : [
{
"name" : "Claudia Madobe",
"gender" : 0,
"megane" : true
},
{
"name" : "Claude Madobe",
"gender" : 1,
"megane" : true
}
]
}
113. @JsonModel
public class User {
public static final int GENDER_FEMALE = 0;
public static final int GENDER_MALE = 1;
@JsonKey
private long id;
@JsonKey
private String name;
@JsonKey
private int gender = GENDER_FEMALE;
@JsonKey
private boolean megane = true;
JsonPullParser
https://github.com/vvakame/JsonPullParser
114. @JsonModel
public class UserList {
@JsonKey
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
JsonPullParser
https://github.com/vvakame/JsonPullParser
115. try {
UserList userList = UserListGen.get(JSON);
Log.d(TAG, "count = " + userList.getUsers().size());
for (User userData : userList.getUsers()) {
Log.d(TAG, "name = " + userData.getName());
}
} catch (IOException e) {
} catch (JsonFormatException e) {
}
JsonPullParser
https://github.com/vvakame/JsonPullParser
116. 実行結果
count = 1
name = Claudia Madobe
name = Claude Madobe
JsonPullParser
https://github.com/vvakame/JsonPullParser
{
"users" : [
{
"name" : "Claudia Madobe",
"gender" : 0,
"megane" : true
},
{
"name" : "Claude Madobe",
"gender" : 1,
"megane" : true
}
]
}
119. Deprecated
119
Camera API
API Level 21でdeprecatedに指定。
Nexus 5XなどではCamera APIをそのまま使うと、
カメラ映像が上下反転する不具合(仕様)有り
https://www.reddit.com/r/Android/comments/3rjbo8/nexus5x_marshmallow_camera_problem/cwqzqgh
•Camera2 API