Professional Documents
Culture Documents
برنامه نویسی اندروید PDF
برنامه نویسی اندروید PDF
com
Mehrdad.j16367@Gmail.com
www.IR-DL.com
android )
www.IR-DL.com
MidleWare
Open Source
API
.
, medial Player
,
.
,
GPS
.
.
.
.
.
,
.
Api ,
www.IR-DL.com
)
.
Google
Twiter ,FaceBook
)
(
.
.
,
;
.
Media Player
.
....,
.
.
C,C++
.
.
.
.
, Gps
www.IR-DL.com
)
Symbin
APi
C , C++
.
GPS
MIDlets
(Abstraction)
MIDlets.
Apple
IPhone
Windows Mobile .
.
4
27 .
Open Source
5
Linux
www.IR-DL.com
)
.
APi
(Interaction)
Apple
IPhone
Windows Mobile .
.
.
Open Source
Linux
APi
(Interaction)
Java
:
.
Java Me
Java Me
.
Java
Linux
(OMA)
www.IR-DL.com
.
.
,
APi
UIQ,S60
.
.
.
IPhone
Iphone .
.
Iphone
Apple
.
Open Source
.
Android phone
:
,
.
7
www.IR-DL.com
)
http://googleblog.blogspot.com/2007/11/wheres-my-gphone.html
:
:1
.
,
Linux
:2
.
, SQLite
Open Source
.
Media
:3
OpenGl , WebKit
( Run Time)
:4
Dalvik
Run Time .
.
( Application FrameWork)
:
,( window manager)
(peer-to-peer)
telephony ,
:5
(location manager)
.
, (content providers,)
.
:6
.
.
(kit)
.
plug-ins
:7
www.IR-DL.com
.
.
Open Source
Gmail
:1
Sms
:2
Google map
:3
:4
,
:5
:6
:7
mp3
:8
www.IR-DL.com
Dalivk
SDK
Sdk
Api
.
,
:
.
.
license
Wifi
:2
GSM, EDGE, 3G
.
:1
:3
SMS
.
Gps
APi
:4
:5
API :6
Ipc
:7
8:
10
www.IR-DL.com
)
WebKit
open Source
:9
:10
.
Google Talk
Peer-to-peer (P2P)
:11
:12
:13
Gps
API
.
.
.
,
, GPS
Api
google Map
Geocoding ,
Google Maps
11
www.IR-DL.com
)
.
.
GPs Google s GSM
.
.
( Background)
.
.
, ,
Sqllit
.
.
Sqllit
12
www.IR-DL.com
.
)
sandboxed
( content providers)
.
6
,
.
3
Notifications, Intents, Content Providers.:
:Notifications
Api
8
LED
Intents
:Intents
)
.
:Content Providers
.
13
www.IR-DL.com
p2p
Google Talk
.
.
Google Talk
2
,
,
.
.
OpenGl
,
.
11
14
www.IR-DL.com
)
.Net Java
.
Virtual Machine
Run Time
RunTime ,
.
.
.
30
.
.
http://www.openhandsetalliance.com/oha_faq.html
OHA
15
www.IR-DL.com
OHA
.
2008
OHA
T-Mobile G1,
.
2008
,
.
..
touch-screen
,
.
:
.
:1
.
16
:2
www.IR-DL.com
)
,
.
,
SDK
,
.
.
OHA
17
30
www.IR-DL.com
Dalvik
.
.
Microsoft Windows (Xp,Vista) :1
Mac Os 10.4.8 or Later (intel Cheapset Only):2
linux :3
.
Android SDK :1
Java Deployment Kit (JDK) 5 or 6 :2
:
JDK
http://java.sun.com/javase/downloads/index.jsp
18
www.IR-DL.com
JDK
.
SDk
.
Android SDK
.
:
http://code.google.com/android/download.html
, APi
Zip
Api
SDK
zip
Eclipse
.
,
Java IDE
ADT
Sdk
19
Eclipse
www.IR-DL.com
Eclipse
.
ADT
.
Elcipse
Ecipse
.
.
:
www.eclipse.org/downloads/
Eclipse 3.4,6.3(Ganymede))
:1
WST :2
.
.
Eclipse
Eclipse
JDT
Zip
WST
Eclipse
workspace
Eclipse
class-to-.dex
ADT
emulator
ADt
,
Eclipse
20
..
converter
,
ADT
www.IR-DL.com
)
Android Project Wizard
template
:1
.
resource editors layout , Forms-based manifest :2
.
,( .deX)
XML
:3
package
Dalvik
,( .apk) package
emulator s
:4
Android Emulator
sms
Heap,Stack , port
screen capture facilities
, process details ,
:6
emulator
.
Stack
:7
breakpoints
.
Console
.
Dalvik
ADT
Eclipse
21
log
DDMS
:7
www.IR-DL.com
3
Ip
.
Smart Hide IP
JDK
:1
http://www.oracle.com/technetwork/java/javase/downloads/index.html
22
www.IR-DL.com
JDK
DK Downlaod
23
www.IR-DL.com
JDK
24
www.IR-DL.com
Eclipse
http://www.eclipse.org/downloads
Eclipse
windows 32
25
www.IR-DL.com
Unzip
Zip
Unzip
26
www.IR-DL.com
27
www.IR-DL.com
unzip
Eclipse
28
www.IR-DL.com
WorkSpace
WorkSpace
WorkSpace
ok
WorkSp
WorkSpace
Eclipse
29
www.IR-DL.com
30
www.IR-DL.com
ADT-18.0.0.zip
http://developer.android.com/sdk/eclipse-adt.html#installing
adt.html#installing
zip
31
www.IR-DL.com
)
.
Help
.
32
www.IR-DL.com
33
ADD
local
www.IR-DL.com
Zip
34
www.IR-DL.com
.
35
Developer Tools
ok
www.IR-DL.com
36
Next
www.IR-DL.com
37
www.IR-DL.com
38
Next
www.IR-DL.com
.
.
Finish
.
ok
39
www.IR-DL.com
.
.
Ecipse
.
Help
40
Restart Now
www.IR-DL.com
Work With
.
http://dl-ssl.google.com/android/eclipse/
Add
41
www.IR-DL.com
ok
name
Eclipse
sdk
sdl
.
http://developer.android.com/sdk/index.html
42
www.IR-DL.com
43
www.IR-DL.com
44
www.IR-DL.com
45
www.IR-DL.com
.
.
46
Finish
www.IR-DL.com
47
www.IR-DL.com
48
install Packets
www.IR-DL.com
Accept All
install
.
Installed
49
Status
www.IR-DL.com
Eclipse
..
Preferences
50
Windows
www.IR-DL.com
)
.
Android
browser
Sdk
51
www.IR-DL.com
ok
Eclipse
52
Apply
www.IR-DL.com
AVD Manager
53
Windows
new
www.IR-DL.com
)
.
54
Name
www.IR-DL.com
)
.
SnapShot
.
Start
Create AVD
.
55
Launch
www.IR-DL.com
)
.
56
www.IR-DL.com
57
www.IR-DL.com
)
SnapShot
.
Project
58
new
file
www.IR-DL.com
)
.
59
Next
Android Project
www.IR-DL.com
60
next
www.IR-DL.com
61
Next
www.IR-DL.com
PacketName
name.name.name
.
Finsih.
.
62
:name
www.IR-DL.com
63
www.IR-DL.com
)
Android Program
RunAs
64
www.IR-DL.com
65
www.IR-DL.com
Activity
.
.
.
Next
Eclipsse
File->New->Project
Project Android
Android
.
.
Next
66
Project name
www.IR-DL.com
Next
67
www.IR-DL.com
.
your.package.namespace.
Package Name
PackageName
)
.
CreateActivity
Application
68
www.IR-DL.com
)
.
finish .
Eclipse
ADT
69
www.IR-DL.com
Run ->Run
Package Explorer
.
.
.
ok .
70
Android Application
www.IR-DL.com
71
www.IR-DL.com
root
:
Xml
.
.... ,
AndroidManifest.Xml
,
Activity ,
Ant script
Component
Build.Xml
local.Properties Deault.properties
Ant script
static
assets
.
Package
Bin\
Gen\
.
third-party JARs
.
.
Libs\
Src\
Ui
Rec\
:Tests\
(....Jpg,png)
72
:Rest\ drawable
www.IR-DL.com
)
Xml
Ui
:Rest\ Layout
Xml
:Rest\ layOut
CSV)
:Res\ Raw
String
Xml
bin\
:Res\ Valuese
:Rest\ Xml
.
.
.
Java
Java
:Bin\ Classes
:Bin\ Classes.dex
.
,Zip
Manifest
Root
AndroidManifest .
.
..
73
. Servic
activitie
www.IR-DL.com
)
.
.
( ) Activity
Manifest
Manifest.
Activity
.
74
www.IR-DL.com
75
www.IR-DL.com
)
.
.
Advanced Push-Button
76
www.IR-DL.com
77
www.IR-DL.com
78
www.IR-DL.com
79
www.IR-DL.com
80
www.IR-DL.com
SkeletonActivity.java
package com.skeleton;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import java.util.Date;
public class SkeletonActivity extends Activity {
Button btn=new Button(this);
private OnClickListener btnOnclickListener= new OnClickListener() {
public void onClick(View v) {
updateTime();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn.setOnClickListener(btnOnclickListener);
updateTime();
setContentView(btn);
}
private void updateTime() {
btn.setText(new Date().toString());
}
}
81
www.IR-DL.com
.
package
..
.
android
package
package com.skeleton;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import java.util.Date;
.
public class SkeletonActivity extends Activity implements View.OnClickListener {
Button btn;
public
android.app.Activity
Activity
.
Android widget
package
button,
user interface
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
btn=new Button(this);
btn.setOnClickListener(this);
updateTime();
setContentView(btn);
82
: Widget
www.IR-DL.com
activity
onCreate()
C#
onCreate()
initializecomponent()
.
.
Button
btn.setOnClickListener(btnOnclickListener);
.
2
1
3
:1
83
www.IR-DL.com
)
:2
.
:3
New .
Ctrl_Space
:
btn.setOnClickListener(btnOnclickListener);
.
Button
setOnClickListener
.
updateTime()
Button
.
.
84
www.IR-DL.com
Button
Text
OnCrete()
.
Button
UpdateTime()
Text
Button
SetContentView(btn)
.
Activity
CTRl+F11
.
.
.
Run
Android Application
Button Text
Button
85
Run
www.IR-DL.com
86
www.IR-DL.com
)
.
.
Java
Java
: If
if( condition )statement 1;
else statement 2;
Statement 1
Boolean
condition
.
{}
Statement 3
Statement 2
False
Statement 1
1:
Int a,b
If(a>b) a=b;
Else b=a;
2
Int a,b
If(a>b)
{
b++
a=b;
}
Else
87
www.IR-DL.com
{
a++
b=a;
}
:
if
IF
else
If
.
Int a,b,c
a=2;
b=3
c=4;
if(a>b){
a++
if(a<b) b++
if(c<a) c++
if
Else
else a++
else b++
}
88
if
www.IR-DL.com
If-ElseIf
.
if(condition)
statement;
else if(condition)
statement;
else if(condition)
statement;
.
.
.
else
statement;
Else
If
.
int a=1;
String stra;
if(a==1)
stra="One";
else if(a==2)
stra="Two";
else if(a==3)
stra="Three";
else
stra="Nothing";
switch
if-else
if
.
"
Switch
Switch
"
:
switch(expression){
89
Value
.
expression
statement sequence
www.IR-DL.com
case value1:
// statement sequence
break;
case value2:
// statement sequence
break;
.
.
.
case valueN:
// statement sequence
break;
default:
// default statement sequence
}
:
int a=1;
String stra;
switch(a)
{
case 1 :
stra="One";
break;
case 2 :
stra="Two";
break;
case 3 :
stra="Three";
break;
default:
stra="Nothing";
}
While
.
"
.
90
( True)
www.IR-DL.com
true
Boolean Expression
Statement
Statement
}
:
int a=0;
while(a<10)
{
a++;
}
For
.
For
.
for([initializes];[BooleanExpression];[iterates];)
{
Statement
}
:
91
www.IR-DL.com
int a=0;
for ( int i = 0; i < 10; i++ )
{
a=a+1;
}
.
type[] array-name=new type[
];
:
int [] myarray=new int [5];
2
type[] array-name=new type[
][
92
];
www.IR-DL.com
Class
.
93
www.IR-DL.com
Finish
94
www.IR-DL.com
95
www.IR-DL.com
Xml
96
www.IR-DL.com
)
:
.
Ctrl+s
.
)
Widget
Xml
(Button,CheckBox,RadioButton, .
: Widget
user interface
.
Widget
Widget
.... Button,ChekBox,RadioButton
Element
(Property)
Xml
Xml
Attribute
.
Widget
Attribute
97
Xml
attribute
(property)
widget
www.IR-DL.com
Xml
EditText
Button
Android Project
(
Test
File->New->Other
Next
next
.
main
finish
android 1.6
( com.test)
Xml
.
widget
98
Package Name
www.IR-DL.com
View
.
main.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="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
99
www.IR-DL.com
)
.
widget
/>
<
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
Widget
< Widget
Property1= Value
Property2= value
Property3= value
.
.
.
propertN= Value />
.
widget :widget
.
Widget
Propery
Property
.
Android:
MyTest
:
Button
100
Value
www.IR-DL.com
Button
Button
<
<Button
Ctrl + Space
.
Widget
.
.
Enter
Property
101
www.IR-DL.com
)
Ctrl+Space
.
.
<Button
android:id="@+id/Button2"
android:layout_width="204dp"
android:layout_height="80dp"
android:text="MYButton"
/>
Widget
widget
R.java
.
.
package com.test;
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
}
102
Xml
www.IR-DL.com
Button
.
Main
main .xml
.
103
www.IR-DL.com
)
)
.
.
.
Ctrl+s
finish
R.java
.
R.java
104
www.IR-DL.com
Widget
( myfile.Xml)
.
R.Java
.
105
Button2,EditText2
www.IR-DL.com
106
www.IR-DL.com
:
.
R.java
Xml
R.java
widget
Xml
Widget
Widget
.
.
.
:1
:2
.
R.java
:3
android:id
NAME
:4
@+id/NAME
:
<Button
android:id="@+id/Button2"
android:layout_width="204dp"
android:layout_height="80dp"
android:text="MYButton"
/>
:5
R.java
public
}
Layout
myfile
main
.
.
107
www.IR-DL.com
Widget
package com.test;
import android.app.Activity;
import android.os.Bundle;
public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
setContentView(R.layout.main);
.
.
.
.
.
108
www.IR-DL.com
Button
main.xml
.
Button1
.
109
button
www.IR-DL.com
package com.skeleton;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import java.util.Date;
public class SkeletonActivity extends Activity {
Button btn=(Button)findViewById(R.id.button1);
private OnClickListener btnOnclickListener= new OnClickListener() {
public void onClick(View v) {
updateTime();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn.setOnClickListener(btnOnclickListener);
updateTime();
setContentView(btn);
}
private void updateTime() {
btn.setText(new Date().toString());
}
}
findViewById
Widget
.
Cast
Button btn=(Button)findViewById(R.id.button1);
.
R.Id.WidgetName
.
Button1
widget
widgetName
!
110
www.IR-DL.com
Id
WidgetName
111
www.IR-DL.com
Widget
112
www.IR-DL.com
Widget
.
Label ,TextBox,Button
widget
.
Label
.
TextView
.
.
label
widget
widget
widget
TextView
widget
(Element)
Name:
Xml
.
:
android:text
:android:typeface
Italic Bold
android:textStyle:
Bold_Italic
113
www.IR-DL.com
(
)
)
RGB.
Hex
android:textColor
(
.
#FF0000
android:textSize
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is Test"
android:textColor="#fF0000"
android:textSize="38dp"
android:textStyle="bold" />
.
:
114
www.IR-DL.com
ImageButton.
Widget
ImageView
.
.
widget 2
android:src
drawable
20
setImageURI().
Button
imageView
ImageButton
.
:
.
115
www.IR-DL.com
116
www.IR-DL.com
1
2
.
117
Advanced:1
www.IR-DL.com
)
.
.
Browser :2
:3
png
.
open :4
:5
finish
image View
.
.
Main.Xml
.
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
Ctrl +
""
android:src
Space
118
www.IR-DL.com
.
.
.
.
Android Application
119
Run as
www.IR-DL.com
)
:
Ctrl+Space
.
120
www.IR-DL.com
CheckBox
.
UnChecked Checked
CheckBox
.
.
android:Text
.
CheckBox
textView
widget
android:textColor
.
.
.
Xml
:android:checked="True"
False True
( UnChecked) .
False
( Checked).
True
:
: isChecked
Checked
. Flase
.
Checked
121
True
setChecked()
www.IR-DL.com
)
:
setOnCheckedChangeListener
.
Checked
CheckBox
UnChecked
"Checked "
EidtText
" UnChecke"
.( MyCheckBox)
.
.
122
www.IR-DL.com
widget
Graphic Layout
.
widget
main.Xml
.
.
.
123
www.IR-DL.com
)
.
Graphic Layout
main.Xml
widget
widget
CheckBox
Form Widgets
.
124
www.IR-DL.com
)
.
EditText
Text Fields
.
.
main.xml
main.xml
125
www.IR-DL.com
android:layout_height="wrap_content"
android:text="@string/hello" />
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CheckBox" />
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName" >
<requestFocus />
</EditText>
</LinearLayout>
126
www.IR-DL.com
.
.
.
CheckBox
127
www.IR-DL.com
:
ch1.setOnCheckedChangeListener(listener);
setOnCheckedChangeListener
.
Button
.
128
www.IR-DL.com
)
.
CheckBox
.
.
C#
EidtText
TextBox
.
EditText:
SetText
C#
TextBox1.Text= Cheked ;
:
EditText et=(EditText)findViewById(id.editText1);
Et.SetText( Cheked )
Radio Button
unchecked , Checked
ChekBox
widget
Radio Up
CheckBox
setOnCheckedChangeListener
.
RadioGroup.
isChecked()
RadioGroup.
Checked
widget
.
Radio Button
Radio Button
.
RadioGroup
129
www.IR-DL.com
)
Check
Id
RadioButton
: Check()
.
RadioButton
RadioButton
.
clearCheck():
getCheckedRadioButtonId():
-1 .
:
( RadioButtomDemo):
main.Xml
.
130
widget
ToolBox
www.IR-DL.com
131
www.IR-DL.com
)
.
Widget
.
main.Xml
.
Radio Button
main.xml
132
www.IR-DL.com
)
widget
.
.
RadioButton
133
www.IR-DL.com
ok
ok
134
Widget
www.IR-DL.com
RadioButton
Red
Green
Blue
AllUncheked
RadioGroup1
radio0
Radio1
Radio2
Button1
RadioGroup
Radio button
Radio button
Radio button
Button
Which
Radibutton is
Checked?
TextView
Button2
Button
TextView1
TextView
unchecked
RadioButton
check
button
RadioButton
package com.radiobutton;
import
import
import
import
import
import
import
import
import
import
import
android.R.string;
android.app.Activity;
android.os.Bundle;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
android.widget.CompoundButton.OnCheckedChangeListener;
android.widget.CompoundButton;
android.widget.RadioButton;
android.widget.RadioGroup;
android.widget.TextView;
135
www.IR-DL.com
TextView tv1;
Button button1;
.
Button button2;
RadioButton rb0;
RadioButton rb1;
RadioButton rb2;
RadioGroup radioGroup;
private OnClickListener listener=new OnClickListener() {
public void onClick(View v) {
UnChecked
RadioButton
radioGroup.clearCheck();
tv1.setText("AllUnChedked");
}
};
private OnCheckedChangeListener listener2=new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
tv1.setText("Red");
}
};
private OnCheckedChangeListener listener3=new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
tv1.setText("Greeen");
}
};
private OnCheckedChangeListener listener4=new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean
isChecked) {
tv1.setText("Blue");
}
};
private OnClickListener listener6=new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int i =radioGroup.getCheckedRadioButtonId();
switch (i) {
case R.id.radio0:
136
RadioButton
www.IR-DL.com
)
tv1.setText("radio0");
break;
case R.id.radio1:
tv1.setText("radio1");
break;
case R.id.radio2:
tv1.setText("radio2");
break;
}
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1=(Button)findViewById(R.id.button1);
button2=(Button)findViewById(R.id.button2);
rb0=(RadioButton)findViewById(R.id.radio0);
rb1=(RadioButton)findViewById(R.id.radio1);
rb2=(RadioButton)findViewById(R.id.radio2);
tv1=(TextView)findViewById(R.id.textView1);
radioGroup=(RadioGroup)findViewById(R.id.radioGroup1);
Widget
button2.setOnClickListener(listener6);
rb0.setOnCheckedChangeListener(listener2);
rb1.setOnCheckedChangeListener(listener3);
rb2.setOnCheckedChangeListener(listener4);
button1.setOnClickListener(listener);
}
}
int i =radioGroup.getCheckedRadioButtonId();
int
Checked
RadioButton
RadioButton
.
.
int
.
.
137
www.IR-DL.com
138
www.IR-DL.com
.
.
(Example
).
.
Button
(Button
main.Xml
widget
.
main.Xml
Widget
.
.
Error
Warning
Warning
:
139
www.IR-DL.com
)
:Error
:Warning
.
.
Error
.
Warning
main.Xml
Error
.
.
<Button
android:id="@+id/button1"
android:layout_width="194dp"
<Button
android:id="@+id/button1"
android:layout_width="194dp"
android:layout_height="wrap_content"
android:text= />
android:layout_height="wrap_content"
android:text="Button" /
Text
140
www.IR-DL.com
Warning
Warning
( C#
.
) Activity
" Help "
.
Warning
Text
Button
Button
Help
" Help"
.
.
String
Strings.Xml
.
.
141
Strings.Xml
www.IR-DL.com
TextView
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" android:textSize="30dp"/>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="50dp"/>
Text
Help
.
Strings.Xml
142
www.IR-DL.com
</String>
143
www.IR-DL.com
)
.
main.Xml
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Strings.Xml
.
android:text="@string/Help"
android:textSize="30dp"/>
@String/
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Help
android:text="@string/Help"
android:textSize="50dp"/>
.
.
Strings.xml
editText
.
Text
widget
text
Widget
NewString
Button
string
.
string
Text
String
144
www.IR-DL.com
)
.
ok
New R.String
145
www.IR-DL.com
Refactor->Android->Extract
.
146
Android String..
www.IR-DL.com
147
www.IR-DL.com
Main.xml
widget
.
.
Properties
General
148
www.IR-DL.com
149
Properties
www.IR-DL.com
)
.
widget
main.xml
Outline
.
Outline
.
radioGroup1
Text
widget
widget
.
150
www.IR-DL.com
LinearLayout
2 textView
Outline
RAdioGroup
Button
.
3
RadioGroup
RadioButton
widget
Full screen
.
CTRL+m
.
FullScreen
.
151
www.IR-DL.com
)
FullScreen
.
Full Screen
152
FullScreen
www.IR-DL.com
153
www.IR-DL.com
Container
154
www.IR-DL.com
)
.
widget
Container
Container
widget
).
widget
( EditText
Button
ViewText EidtText
widget
widget
.
LinearLayout:1
RelativeLayout:2
TableLayout:3
Scrollwork:4
:LinearLayout
5
widget
:
155
www.IR-DL.com
Orientation:1
.
LinearLayout
.
LinearLayout
horizontal
vertical
android:orientation
setOrientation()
horizontal
vertical
Fill Model:2
widget
RadioButton
widget
.
.
.
LinearLayout
android:layout_width
widget
android:layout_height
:
.
125px
125px
:
fill_parent
widget
;
156
wrap_content:
www.IR-DL.com
(
EditText
)
.
widget
157
www.IR-DL.com
)
Weight:3
widget
android:layout_width
fill_parent
widget
android:layout_height
widget
widget
android:layout_weight
1
.
android:layout_weight
1
.
2
widget
:
.
widget
android:layout_weight
android:layout_weight
100
158
widget
:
:
:
www.IR-DL.com
)
Gravity:4
.
Widget
android:layout_gravity
setGravity()
Padding :5
.
widget
Padding
widget
setPadding()
widget
159
Padding
www.IR-DL.com
)
android:paddingTop, android:paddingLeft, android:paddingRight
android:paddingBottom
:
.
main.Xml
<RadioGroup android:id="@+id/orientation"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5px">
<RadioButton
android:id="@+id/horizontal"
android:text="horizontal" />
<RadioButton
android:id="@+id/vertical"
android:text="vertical" />
</RadioGroup>
<RadioGroup android:id="@+id/gravity"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5px">
<RadioButton
android:id="@+id/left"
android:text="left" />
<RadioButton
android:id="@+id/center"
android:text="center" />
<RadioButton
android:id="@+id/right"
android:text="right" />
</RadioGroup>
</LinearLayout>
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Gravity;
android.widget.LinearLayout;
android.widget.RadioGroup;
android.widget.RadioGroup.OnCheckedChangeListener;
160
www.IR-DL.com
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
orientation=(RadioGroup)findViewById(R.id.orientation);
orientation.setOnCheckedChangeListener(listener);
gravity=(RadioGroup)findViewById(R.id.gravity);
gravity.setOnCheckedChangeListener(listener);
}
161
www.IR-DL.com
RelativeLayout
widget
.
widget
.
widget
.
.
EditText
TextView
:1
Button
ok
:3
EditText
Button
Cancel
:2
Button
162
:4
:5
www.IR-DL.com
)
:2 1
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:text="Enter Your NAme"
android:id="@+id/tvName"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/edName"
/>
<EditText android:id="@+id/edName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_toRightOf="@+id/tvName"
/>
</RelativeLayout>
android:layout_alignParentTop="true"
TextView
:
widget
android:layout_alignBaseline="@+id/edName"
widget
EditText
android:layout_toRightOf="@+id/tvName"
widget
widget
EditText
tvName
163
TextView
www.IR-DL.com
)
5 4 3
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/tvName"
android:layout_alignParentLeft="true"
android:text="Enter Your NAme" />
<EditText
android:id="@+id/etName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/tvName" />
<Button
android:id="@+id/btnOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/etName"
android:text="ok" />
<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRightt="true"
android:layout_below="@+id/etName"
android:layout_toLeftOf="@+id/btnOk"
android:text="Cancel" />
</RelativeLayout>
android:layout_alignParentRight="true"
android:layout_below="@+id/etName"
EditText
android:layout_alignParentRightt="true"
android:layout_below="@+id/etName"
android:layout_toLeftOf="@+id/btnOk"
EditText
.
widget
RelativeLayout
android:padding
(
164
ok
www.IR-DL.com
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="0dp"
>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
>
TableLayout
.
container
.
widget
2
<TableRow >
.
<TableLayout >
<TableRow >
</TableRow>
<TableRow >
</TableRow>
</TableLayout>
widget
<TableRow >
165
www.IR-DL.com
)
:
widget
.
widget 2
.
widget 5
5
166
www.IR-DL.com
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="Enter YourName"/>
<EditText android:id="@+id/edNAme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button android:text="OK"
android:id="@+id/btnOk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button android:text="Cancel"
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button android:text="Exit"
android:id="@+id/btnExit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvFamily"
android:text="Enter Family"/>
<EditText android:id="@+id/edFamily"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
3
.
167
www.IR-DL.com
)
stretchColumns:1
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="Enter YourName"/>
<EditText android:id="@+id/edNAme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvFamily"
android:text="Enter Family"/>
<EditText android:id="@+id/edFamily"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
widget
.
.
/>
android:stretchColumns
</TableRow>
</TableLayout>
TableLayout
( )
.
widget
168
www.IR-DL.com
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1" >
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="Enter YourName"/>
<EditText android:id="@+id/edNAme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
widget
1
/>
</TableRow>
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvFamily"
android:text="Enter Family"/>
<EditText android:id="@+id/edFamily"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
android:stretchColumns="1,0"
1 0
Widget
android:stretchColumns="0"
Widget
.
169
www.IR-DL.com
)
android:shrinkColumns:2
.
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="Enter YourName -----------------------------------------------"/>
<EditText android:id="@+id/edNAme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
widget
.
widget
android:shrinkColumns:.
.
widget
( )
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:shrinkColumns="0" >
<TableRow >
170
www.IR-DL.com
)
android:collapseColumns :3
.
( )
.
0
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:collapseColumns="0"
>
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="Enter YourName"/>
<EditText android:id="@+id/edNAme"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
Scrollwork:4
widget
container
widget
.
Scroll
<ScrollView >
</ScrollView>
:
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
171
www.IR-DL.com
(
android:stretchColumns="0">
<TableRow>
<View
android:layout_height="80px"
android:background="#000000"/>
<TextView android:text="#000000"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#440000" />
<TextView android:text="#440000"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#884400" />
<TextView android:text="#884400"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#aa8844" />
<TextView android:text="#aa8844"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#ffaa88" />
<TextView android:text="#ffaa88"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#ffffaa" />
<TextView android:text="#ffffaa"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#ffffff" />
<TextView android:text="#ffffff"
android:paddingLeft="4px"
/>
/>
/>
/>
/>
/>
172
www.IR-DL.com
(
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#101056" />
<TextView android:text="#101056"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#112548" />
<TextView android:text="#112548"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
<TableRow>
<View
android:layout_height="80px"
android:background="#751357" />
<TextView android:text="#751357"
android:paddingLeft="4px"
android:layout_gravity="center_vertical"
</TableRow>
</TableLayout>
</ScrollView>
)
/>
/>
/>
/>
173
www.IR-DL.com
Selection Widget
174
www.IR-DL.com
)
.
.. list comboBox
DataAdapter
widget
.
widget
widget
Adapter
widget
.
.
ArrayAdapter
Adapter
.
3
.(This)
ArrayAdapter
(
Activity
) DataContext:1
(Items)
)
.(
TextView
175
:2
).
www.IR-DL.com
getview
ArrayView
Text
widget
LsitBox:1
listBox
ListView
ArrayAdapter
widget
setAdapter
widget
.
setOnItemSelectedListener
:
( TestListBox)
.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/selection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
/>
</LinearLayout>
176
Main.Xml
TxttView
TextView
ListView
www.IR-DL.com
Import
widget
CTrl+Shift+o
:
package com.testListBox;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.widget.ArrayAdapter;
android.widget.ListView;
android.widget.TextView;
177
www.IR-DL.com
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listview=(ListView)findViewById(android.R.id.list);
selection =(TextView)findViewById(R.id.selection);
listview.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,items));
.
}
ArrayList
178
www.IR-DL.com
listview.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.select_dialog_singlechoice,items));
listView
android:choiceMode="singleChoice""
listview.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_multiple_choice,items));
listView
android:choiceMode="multipleChoice"
list
setOnItemSelectedListener
import android.widget.AdapterView.OnItemSelectedListener;
listview.setOnItemSelectedListener()
Ctrl+Space
179
new
Cursor
www.IR-DL.com
listview.setOnItemSelectedListener(new OnItemSelectedListener() {
})
OnItemSelectedListener
Add unimplemented
.
listview.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
})
180
www.IR-DL.com
listview.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View view,
int arg2, long arg3) {
selection.setText(items[arg2]);
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
arg2
:listView
listview.getSelectedItem();:1
istview.getSelectedItemPosition():2
listview.getItemAtPosition();:3
Spinner:2
ListBox
.
.
DropDown
Spiner
LsitBox
.
listBox
181
Spiner
www.IR-DL.com
)
:
.
Spiner
( SpinerTest)
Main.Xml
.
import
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.AdapterView;
android.widget.AdapterView.OnItemSelectedListener;
android.widget.ArrayAdapter;
android.widget.Spinner;
android.widget.TextView;
182
listView
www.IR-DL.com
TextView tvSelection;
String [] items={"Red","Blue","Green","Black","White"};
Spinner spiner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvSelection=(TextView)findViewById(R.id.tvSelection);
spiner=(Spinner)findViewById(R.id.Spiner);
spiner.setAdapter( new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item,items));
spiner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
tvSelection.setText(spiner.getSelectedItem().toString());
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
list View
Spiner
listview.getSelectedItem()
}
istview.getSelectedItemPosition()
listview.getItemAtPosition()
183
www.IR-DL.com
184
www.IR-DL.com
GridView:3
2
Adapter
..
.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/selection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<GridView
android:id="@+id/grid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:verticalSpacing="35px"
android:horizontalSpacing="5px"
android:numColumns="auto_fit"
android:columnWidth="100px"
android:stretchMode="columnWidth"
android:gravity="center"
/>
</LinearLayout>
android:numColumns="auto_fit"
Grid View
android:stretchMode="columnWidth
"
auto_fit
android:numColumns="auto_fit"
.
185
www.IR-DL.com
)
320
android:columnWidth="100px"
android:horizontalSpacing="5px"
4 3
310
.
android:stretchMode="spacingWidth"
java
import
import
import
import
import
import
import
import
public
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.AdapterView;
android.widget.ArrayAdapter;
android.widget.GridView;
android.widget.TextView;
android.widget.AdapterView.OnItemClickListener;
class GridTextActivity extends Activity {
TextView selection;
GridView gridView;
String[] items={"1", "2", "3", "4", "5",
"6", "7", "7", "8", "9",
"10", "11", "12", "13", "14",
"15", "16", "17", "18", "19",
"20", "21", "22", "23", "24"};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
selection=(TextView)findViewById(R.id.selection);
gridView=(GridView) findViewById(R.id.grid);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, items, items);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
selection.setText(items[arg2]);
}
});
186
www.IR-DL.com
:
android:numColumns="auto_fit"
!
.
35
Widget
Spiner
EditText
AutoCompleteTextView
AutoCompleteTextView
187
www.IR-DL.com
)
.
Spiner
EditTect
AutoCompleteTextView
...
android:completionThreshold
.
)
setAdapter
(
( AutoCompleteTextViewTest)
main.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="fill_parent"
AutoComplete
android:orientation="vertical" >
TextView
<TextView
android:id="@+id/selection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<AutoCompleteTextView android:id="@+id/edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:completionThreshold="3"/>
</LinearLayout>
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.text.Editable;
android.text.TextWatcher;
188
AutoComplete
3
www.IR-DL.com
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
public class AutoCompleteTextViewTestActivity extends Activity {
TextView selection;
AutoCompleteTextView edit;
String[] items={"lorem", "ipsum", "dolor", "sit", "amet",
"consectetuer", "adipiscing", "elit", "morbi", "vel",
"ligula", "vitae", "arcu", "aliquet", "mollis",
"etiam", "vel", "erat", "placerat", "ante",
"porttitor", "sodales", "pellentesque", "augue", "purus"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
selection=(TextView)findViewById(R.id.selection);
edit=(AutoCompleteTextView)findViewById(R.id.edit);
edit.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line,
items));
edit.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
selection.setText(edit.getText());
getTect
}
public void beforeTextChanged(CharSequence s, int start, int
count,
int after) {
// TODO Auto-generated method stub
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
}
189
www.IR-DL.com
190
www.IR-DL.com
)
ListView
.
,
listView
CheckBox
.
.
.
( ImageWithIcom)
Drag
191
www.IR-DL.com
ok
CopyFiles
.
.
192
Error
www.IR-DL.com
F2
.
f2
.
.
.
listview.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.select_dialog_singlechoice,items));
193
www.IR-DL.com
listview.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.
simple_list_item_multiple_choi
ce,items));
.
.
Main.xml
Row
194
Xml
www.IR-DL.com
195
www.IR-DL.com
196
www.IR-DL.com
finish
197
Row
www.IR-DL.com
main.Xml
.
198
Java
www.IR-DL.com
(
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
.
android.view.View;
android.widget.AdapterView;
android.widget.ArrayAdapter;
android.widget.ListView;
android.widget.RadioButton;
android.widget.TextView;
android.widget.AdapterView.OnItemSelectedListener;
R.layout.row,R.id.label, items));
listview.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View view,
int arg2, long arg3) {
selection.setText(items[arg2]);
}
public void onNothingSelected(AdapterView<?> arg0) {
selection.setText("Nothing");
}
});
}
}
199
www.IR-DL.com
listview.setAdapter(new ArrayAdapter<String>(this,
R.layout.row,R.id.label, items));
.
.
TextView
Text
Row
Label
widget
ArrayAdapter
DataContext
TextView
200
www.IR-DL.com
row
.
.
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="44sp"
/>
CheckBox
<
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="44sp"
/>
201
www.IR-DL.com
<EditText
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="44sp"
/>
:
(
(
2
)
Ovveride
Widget
Addapter
getView()
.
View
getView()
.
.
Addapter
getView()
.
.
Drag
delete , ok_Icon
202
www.IR-DL.com
)
.
import
import
import
import
import
import
import
import
import
import
import
import
import
java
android.app.Activity;
android.os.Bundle;
android.text.style.SuperscriptSpan;
android.view.LayoutInflater;
android.view.View;
android.view.ViewGroup;
android.widget.AdapterView;
android.widget.AdapterView.OnItemSelectedListener;
android.widget.ArrayAdapter;
android.widget.ImageView;
android.widget.ListView;
android.widget.RadioButton;
android.widget.TextView;
}
public void onNothingSelected(AdapterView<?> arg0) {
selection.setText("Nothing");
}
});
203
www.IR-DL.com
.Net
Base
Super
IConicnAdapter
ArrayAdapert
.
class IconicAdapter extends ArrayAdapter {
IconicAdapter() {
super(ImageWithIcomActivity.this, R.layout.row, items);
}
public View getView(int position, View convertView,
ViewGroup parent) {
LayoutInflater inflater=getLayoutInflater();
View row=inflater.inflate(R.layout.row, parent);
TextView label=(TextView)row.findViewById(R.id.label);
label.setText(items[position]);
ImageView icon=(ImageView)row.findViewById(R.id.icon);
if (items[position].length()>4) {
icon.setImageResource(R.drawable.delete);
}
else {
icon.setImageResource(R.drawable.ok_icon);
}
return(row);
}
}
ArrayAdapter
DataContex) ArrayAdapter
Activity
row
ovverride
get View
.
Xml
getLayoutInflater
xml
LayoutInflater
.
.
ok_icon
TextView
delete
204
xml
Text
4
Inflate
www.IR-DL.com
Fancy Widgets
205
www.IR-DL.com
)
widget
widget
.
TimePickerDialog DatePickerDialog
TimePicker DatePicker
:
.
.
( testPick).
.
main.xml
206
www.IR-DL.com
java
import
import
import
import
import
import
import
import
import
import
import
import
java.text.DateFormat;
java.util.Calendar;
android.app.Activity;
android.app.DatePickerDialog;
android.app.DatePickerDialog.OnDateSetListener;
android.app.TimePickerDialog;
android.os.Bundle;
android.view.View;
android.widget.Button;
android.widget.DatePicker;
android.widget.TextView;
android.widget.TimePicker;
DateFormat
)
(
getDateTimeInstance()
.
Calender
.
.
DateAndTime
207
TimePickerDialog
DateAndTime
Calender
www.IR-DL.com
)
updateLabel();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.dateBtn);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new DatePickerDialog(TestPickActivity.this,
d,
DateAndTime.get(Calendar.YEAR),
DateAndTime.get(Calendar.MONTH),
DateAndTime.get(Calendar.DAY_OF_MONTH)).show();
}
});
DatePickerDialog
DatePickerDialog
.
btn=(Button)findViewById(R.id.timeBtn);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new TimePickerDialog(TestPickActivity.this,
TimePickerDialog
t,
DateAndTime.get(Calendar.HOUR_OF_DAY),
.
TimePickerDialog
DateAndTime.get(Calendar.MINUTE),
true).show();
}
});
dateAndTimeLabel=(TextView)findViewById(R.id.dateAndTime);
updateLabel();
}
private void updateLabel() {
dateAndTimeLabel.setText(fmtDateAndTime.format(DateAndTime.getTime()));
}
TextView
dateAndTimeLabe
208
www.IR-DL.com
AnalogClock
DigitalClock
widet
.
!
209
www.IR-DL.com
(
.
)
widget
Xml
</RelativeLayout>
210
www.IR-DL.com
)
Chronometer
Chronometer
Start()
Stop().
main.Xm
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Chronometer
android:id="@+id/chronometer1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp"
android:text="Chronometer" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/chronometer1"
android:layout_marginLeft="32dp"
android:layout_marginTop="34dp"
android:text="Start" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button3"
android:layout_alignBottom="@+id/button3"
android:layout_centerHorizontal="true"
211
www.IR-DL.com
android:text="Stop" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button1"
android:layout_alignBottom="@+id/button1"
android:layout_alignParentRight="true"
android:layout_marginRight="22dp"
android:text="Reset" />
</RelativeLayout>
.
import
import
import
import
import
import
import
Java
android.app.Activity;
android.os.Bundle;
android.os.SystemClock;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
android.widget.Chronometer;
}
});
btnStop.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
ch.stop();
}
}) ;
212
www.IR-DL.com
btnReset.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
ch.setBase(SystemClock.elapsedRealtime());
}
});
}
}
213
www.IR-DL.com
Progress bar
.
2
:1
.
.
:2
Progress Bar
Progress Bar
SetMax()
SetProgress()
.
.
:
( TestProgress)
.
main.xml
214
www.IR-DL.com
android:id="@+id/progressbar_Horizontal"
android:max="100" />
</LinearLayout>
.
package com.testProgress;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.os.Handler;
android.os.Message;
android.widget.ProgressBar;
thread
myProgress
.
setProgress()
ProgressBar
Thread.sleep(100);
myProgress++;
myProgressBar.setProgress(myProgress);
}
catch(Throwable t){ }
}
}
};
thread
215
www.IR-DL.com
TabHost
.
Tab
.
.
TabHost
.
.
.
TextView
container
TabHost
TabWidget
Container
FrameLayout
216
FrameLayout
www.IR-DL.com
)
@android:id/tabs.
@android:id/tabhost
tabhost
TabWidget
TabActivity,
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
FrameLaout
FrameLayout
Tab
.
</FrameLayout>
</LinearLayout>
widegt
</TabHost>
EditText
Tab
RadioGroup
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tabhost"
217
Tab
www.IR-DL.com
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tab1">
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1" >
<TableRow >
<RadioButton android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="Fmale"/>
</TableRow>
<TableRow >
<RadioButton android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvFamily"
android:text="male"/>
</TableRow>
</TableLayout>
</FrameLayout>
<FrameLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/tab2">
<TableLayout android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1" >
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="Enter YourName"/>
<EditText android:id="@+id/edNAme"
android:layout_width="wrap_content"
218
www.IR-DL.com
)
android:layout_height="wrap_content" />
</TableRow>
<TableRow >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/tvFamily"
android:text="Enter Family"/>
<EditText android:id="@+id/edFamily"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
</FrameLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
java
import android.app.Activity;
import android.os.Bundle;
import android.widget.TabHost;
public class TestTabActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TabHost tabs=(TabHost)findViewById(R.id.tabhost);
tabs.setup();
Tabspec
TabHost.TabSpec spec=tabs.newTabSpec("tag1");
spec.setContent(R.id.tab1);
spec.setIndicator("MorF");
tabs.addTab(spec);
spec=tabs.newTabSpec("tag2"); Header
spec.setContent(R.id.tab2);
spec.setIndicator("Info");
219
SetContent
Xml
www.IR-DL.com
tabs.addTab(spec);
}
}
220
www.IR-DL.com
221
www.IR-DL.com
)
ViewFlipper
Tab
.
.
.
ViewFlipper .
ViewFlipper
FrameLayout
View
ViewFlipper
.
.
:
( testViewFlipper)
.
Main.Xml
222
widget
Flip
www.IR-DL.com
android:textColor="#FFFF0000"
android:text="This is the second panel"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#FFFFFF00"
android:text="This is the third panel"
/>
</ViewFlipper>
</LinearLayout>
Java
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.Button;
android.widget.ViewFlipper;
223
www.IR-DL.com
viewFilpper
.
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.View;
android.widget.Button;
android.widget.ViewFlipper;
2000
Flip
224
www.IR-DL.com
SlidingDrawer
.
.
SlidingDrawer
container
2
ImageView
Button
Container
225
SlidingDrawer
:1
:2
www.IR-DL.com
( testSlidingDrawer)
.
main.xml
226
www.IR-DL.com
227
www.IR-DL.com
)
.
HTC Magic
T-Mobile G1,
1mf
.
.
EditText
(1mf)
.
editText
1mf
1mf .
..
EdiText
1.1
android:password
EditText
android:inputType
"|"
.
text (the default)
number
phone
datetime
date
time
main.xml
228
www.IR-DL.com
229
www.IR-DL.com
)
.
230
www.IR-DL.com
231
www.IR-DL.com
)
.
.
options menu
.
ContextMenu
(
)
.
)Menus of Options
:
.
.
More
.
.
"
232
"
www.IR-DL.com
res
other
Next
233
www.IR-DL.com
Menu
finish
234
www.IR-DL.com
Menu
subfolder
Add
ok
235
Group
www.IR-DL.com
Group1
Add
Item
, ok
236
www.IR-DL.com
237
www.IR-DL.com
Main.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="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
</LinearLayout>
238
EditText
www.IR-DL.com
)
java
Override
.
package com.testMenu;
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.MenuInflater;
android.view.MenuItem;
android.widget.EditText;
return super.onOptionsItemSelected(item);
}
}
239
www.IR-DL.com
ContextMenu
.
Cut ,copy
OptionMenu
.
Context_menu
Xml
.
240
,past
www.IR-DL.com
Override
.
Conetex
Widget
Contextmenu
.
package com.testMenu;
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.ContextMenu;
android.view.Menu;
android.view.MenuInflater;
android.view.MenuItem;
android.view.View;
android.view.ContextMenu.ContextMenuInfo;
android.widget.EditText;
241
2
.
www.IR-DL.com
registerForContextMenu(editText);
Contextmenu
EditText
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflater mnu= getMenuInflater();
mnu.inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId())
{
case R.id.musetingd:
editText.setText("Setting Clicked!");
break;
case R.id.mnuHelp:
editText.setText("HelpClicked!");
break;
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater mnu= getMenuInflater();
mnu.inflate(R.menu.context_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId())
{
case R.id.mnuCut:
242
ContextMenu
www.IR-DL.com
editText.setText("Cut Clicked!");
break;
case R.id.meuCopy:
editText.setText("copy Clicked!");
break;
case R.id.mnuPast:
editText.setText("Past Clicked!");
break;
}
return super.onContextItemSelected(item);
}
}
243
EditText
.
www.IR-DL.com
)
EditText
widget
.. SelectWord Selectall
EditText
Cut
244
past Copy
Cursor
Enter
InputText
www.IR-DL.com
3
2
245
www.IR-DL.com
246
www.IR-DL.com
Dialog
247
www.IR-DL.com
)
.
Alert Dialog :1
Ok
Dialog
.
Cancel
Exit
No
248
Yes
Toast
www.IR-DL.com
)
( testDialog)
main.xml
.
import
import
import
import
import
import
import
import
import
import
java
android.app.Activity;
android.app.AlertDialog;
android.app.AlertDialog.Builder;
android.app.Dialog;
android.content.DialogInterface;
android.os.Bundle;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
android.widget.Toast;
Dialog
widget
Id
}
};
Id
249
ShowDialog
onCreateDialog
www.IR-DL.com
Button btnEdit=(Button)findViewById(R.id.btnExit );
btnEdit.setOnClickListener(listener);
}
@Override
protected Dialog onCreateDialog(int id) {
switch(id)
{
case Dialog_Reset:
AlertDialog.Builder builder=new Builder(this);
return builder
Switch
AlertDialog.Builder
Alert Dialog
.create();
Button
setNegativeButton
Button
return super.onCreateDialog(id);
}
}
DialogInterface.OnClickListener
.
Toast.makeText(TestDialogActivity.this, "Selected Yes",20).show();
Toast.makeText(TestDialogActivity.this, "Selected No", 20).show();
250
www.IR-DL.com
Progress Dialog :2
.
Progress
( testProgressDialog)
main.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="fill_parent"
251
www.IR-DL.com
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:id="@+id/btnExit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Exit" />
</LinearLayout>
.
import
import
import
import
import
import
import
import
;
android.app.Activity;
android.app.Dialog;
android.app.ProgressDialog;
android.os.Bundle;
android.os.Handler;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
252
java
www.IR-DL.com
case Dialog_Reset:
ProgressDialog progressDialog =new ProgressDialog(this);
progressDialog.setMessage("Doing Somthing ....");
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog=progressDialog;
Thread thread =new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
handler.sendEmptyMessage(0);
}
handler.sendEmptyMessage(0);
}
});
thread.start();
return dialog;
return null;
}
private Dialog dialog=null;
private Handler handler=new Handler()
{
public void handleMessage(android.os.Message msg)
{
dialog.dismiss();
};
};
}
253
www.IR-DL.com
Custom Dialoge:3
Layout
Xml
.
custome_dialog.xml
254
xml
www.IR-DL.com
<Button
android:id="@+id/button1"
android:layout_width="205dp"
android:layout_height="wrap_content"
android:text="Button" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CheckBox" />
</LinearLayout>
.
import
import
import
import
import
android.app.Activity;
android.app.Dialog;
android.os.Bundle;
android.view.View;
android.view.View.OnClickListener;
255
Java
www.IR-DL.com
import android.widget.Button;
return super.onCreateDialog(id);
}
}
256
www.IR-DL.com
257
www.IR-DL.com
258
www.IR-DL.com
)
WebView
widget
.
loadUrl
.
11
11
259
Api
www.IR-DL.com
)
.
260
www.IR-DL.com
( testweb)
.
main.xml
java
package com.testweb;
import android.app.Activity;
import android.os.Bundle;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
public class TestwebActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.web_view);
webView.loadUrl("http://edumobile.org/android/");
}
}
261
www.IR-DL.com
, Shape
262
www.IR-DL.com
Shape
...
shape
.
(TestShape)
.
java
import android.app.Activity;
import android.os.Bundle;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
android.app.Activity;
android.content.Context;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.ComposePathEffect;
android.graphics.CornerPathEffect;
android.graphics.DashPathEffect;
android.graphics.Paint;
android.graphics.Path;
android.graphics.PathDashPathEffect;
android.graphics.PathEffect;
android.graphics.RectF;
android.os.Bundle;
android.view.KeyEvent;
android.view.View;
263
www.IR-DL.com
)
private static void makeEffects(PathEffect[] e, float phase) {
e[0] = null;
// no effect
e[1] = new CornerPathEffect(10);
e[2] = new DashPathEffect(new float[] {10, 5, 5, 5}, phase);
e[3] = new PathDashPathEffect(makePathDash(), 12, phase,
PathDashPathEffect.Style.ROTATE);
e[4] = new ComposePathEffect(e[2], e[1]);
e[5] = new ComposePathEffect(e[3], e[1]);
}
public SampleView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(6);
mPath = makeFollowPath();
mEffects = new PathEffect[6];
mColors = new int[] { Color.BLACK, Color.RED, Color.BLUE,
Color.GREEN, Color.MAGENTA, Color.BLACK
};
}
@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
RectF bounds = new RectF();
mPath.computeBounds(bounds, false);
canvas.translate(10 - bounds.left, 10 - bounds.top);
makeEffects(mEffects, mPhase);
mPhase += 1;
invalidate();
for (int i = 0; i < mEffects.length; i++) {
mPaint.setPathEffect(mEffects[i]);
mPaint.setColor(mColors[i]);
canvas.drawPath(mPath, mPaint);
canvas.translate(0, 28);
}
Paint p = new Paint();
// smooths
p.setColor(Color.RED);
canvas.drawCircle(50, 50, 30, p);
264
www.IR-DL.com
)
p.setColor(Color.YELLOW);
canvas.drawRect(100, 100, 50,40, p);
p.setColor(Color.RED);
p.setTextSize(25);
canvas.drawText("Mehrdad Javidi & Shahram Ramesht", 0,
300, p);
}
@Override public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
mPath = makeFollowPath();
return true;
}
return super.onKeyDown(keyCode, event);
}
private static Path makeFollowPath() {
Path p = new Path();
p.moveTo(0, 0);
for (int i = 1; i <= 15; i++) {
p.lineTo(i*20, (float)Math.random() * 35);
}
return p;
}
private static Path makePathDash() {
Path p = new Path();
p.moveTo(4, 0);
p.lineTo(0, -4);
p.lineTo(8, -4);
p.lineTo(12, 0);
p.lineTo(8, 4);
p.lineTo(0, 4);
return p;
}
}
}
265
www.IR-DL.com
266
www.IR-DL.com
Main.Xml
VideoView
.
<?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="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<VideoView
android:id="@+id/videoView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
.
import
import
import
import
import
java
android.app.Activity;
android.net.Uri;
android.os.Bundle;
android.widget.MediaController;
android.widget.VideoView;
267
www.IR-DL.com
res\\Drawable-hdpi\\a.mp4
268
a.mp4
www.IR-DL.com
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/idHello"
android:text="@string/stringHello"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
/>
<Button
android:id="@+id/idGoodBye"
android:text="@string/stringGoodbye"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
String.xml
.
package com.testpalyVideo;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
269
java
www.IR-DL.com
import android.widget.Button;
public class TestplayVideoActivity extends Activity {
/**
* Variables
*/
MediaPlayer mp
String hello
String goodbye
= null;
= "Hello!";
= "GoodBye!";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**
* Talking with the buttonHello
*/
final Button buttonHello = (Button) findViewById(R.id.idHello);
buttonHello.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
managerOfSound(hello);
} // END onClick()
}); // END buttonHello
/**
* Talking with the buttonGoodBye
*/
final Button buttonGoodBye = (Button) findViewById(R.id.idGoodBye);
buttonGoodBye.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
managerOfSound(goodbye);
} // END onClick()
}); // END buttonGoodBye
} // END onCreate()
/**
* Manager of Sounds
*/
protected void managerOfSound(String theText) {
if (mp != null) {
mp.reset();
mp.release();
}
if (theText == hello)
mp = MediaPlayer.create(this, R.raw.hello);
else if (theText == goodbye)
mp = MediaPlayer.create(this, R.raw.goodbye);
else
mp = MediaPlayer.create(this, R.raw.what);
mp.start();
}
}
270
www.IR-DL.com
mp3
271
www.IR-DL.com
SqlLit
272
www.IR-DL.com
( SL) SqlList
.
android
openSource
SL
Sql
( 250kb)
integer ,Real,String
Sl
.
String
Sl
.
int ,
Sl
Sql
Sl
.
.
.
. AsyncTask
.
DATA/data/APP_NAME/databases/FILENAME.
Environment.getDataDirectory()
Date
APP_NAME
273
www.IR-DL.com
)
.
FILENAME
Sl
Packages :1
android.database
Sl
android.database.sqlite
SQLiteOpenHelper :2
.
.
Super()
override
onUpgrade() onCreate()
onCreate
onUpgrade()
.
.
SQLiteDatabase
.
getReadableDatabase() SQLiteOpenHelper
SQLiteDatabase
getWriteableDatabase()
274
www.IR-DL.com
)
.
id
.
SQLiteDatabase
Sl
open, query, update and close
key
Sql
execSQL()
ContentValues
key/values
Valuese
Query
query() rawQuery()
.
.
SQLiteQueryBuilder
Sql
rawQuery()
SqlQuery
.
query()
Sql
SQLiteQueryBuilder
rawQuery()
275
www.IR-DL.com
query()
return database.query(DATABASE_TABLE,
new String[] { KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY, KEY_DESCRIPTION },
Parameter
Query
Comment
String dbName
int[] columnNames
Null
String
whereClause
Nul
whereClause
String[]
selectionArgs
whereClause
placeholders
String[] groupBy
Group
String[] having
String[] orderBy
Group
Null
Cursor
276
www.IR-DL.com
(
.
)
Query
Cursor
Cursor
query
.
.
.
query
getCount()
moveToNext() moveToFirst()
.
getLong(columnIndex),
Cursor
get*()
getString(columnIndex)
.
SimpleCursorAdapter
ListViews, ListActivities
ListActivities .
.
ListView
SimpleCursorAdapter
.
ListView
LsitView
Sl
:
277
www.IR-DL.com
Package Name
activity
de.vogella.android.sqlite.first
TestDatabaseActivity.
278
www.IR-DL.com
package de.vogella.android.sqlite.first;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
@Override
279
www.IR-DL.com
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(MySQLiteHelper.class.getName(),
"Upgrading database from version " + oldVersion +
" to "
+ newVersion + ", which will
destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_COMMENTS);
onCreate(db);
}
Comment
.
package de.vogella.android.sqlite.first;
280
www.IR-DL.com
DAO
.
CommentsDataSource
Comment
package de.vogella.android.sqlite.first;
import java.util.ArrayList;
281
www.IR-DL.com
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
// Database fields
private SQLiteDatabase database;
private MySQLiteHelper dbHelper;
private String[] allColumns = { MySQLiteHelper.COLUMN_ID,
MySQLiteHelper.COLUMN_COMMENT };
282
www.IR-DL.com
283
www.IR-DL.com
)
allColumns, null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Comment comment = cursorToComment(cursor);
comments.add(comment);
cursor.moveToNext();
}
// Make sure to close the cursor
cursor.close();
return comments;
}
Main.Xml
284
www.IR-DL.com
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add New"
android:onClick="onClick"/>
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete First"
android:onClick="onClick"/>
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
285
www.IR-DL.com
)
TestDatabaseActivity
package de.vogella.android.sqlite.first;
import java.util.List;
import java.util.Random;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
286
www.IR-DL.com
)
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
287
www.IR-DL.com
)
adapter.notifyDataSetChanged();
@Override
protected void onResume() {
datasource.open();
super.onResume();
}
@Override
protected void onPause() {
datasource.close();
super.onPause();
}
SqlList
ContentProvider
288
www.IR-DL.com
)
.
ContentProvider
.
Sl
ContentProvider
ContentProvider
.
android.content.ContentProvider
ContentProvider
AndroidManifest.xml
<provider
android:authorities="de.vogella.android.todos.contentprovider"
android:name=".contentprovider.MyTodoContentProvider" >
</provider>
289
www.IR-DL.com
query(),
ContentProvider
ContentProvider
android:exported=false
Thread Safety
.
.
290
www.IR-DL.com
)
ContentProvider
.
thread-safe
ContentProvider
synchronized
ContentProvider
:
.
People
.
.
291
Contact
www.IR-DL.com
292
Account
www.IR-DL.com
Package Name
project
Activity
de.vogella.android.contentprovider
ContactsView
Main.Xml
293
www.IR-DL.com
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/contactview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
Permission
AndroidManifest.xml
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
ContactsView
package de.vogella.android.contentprovider;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.TextView;
294
www.IR-DL.com
while (cursor.moveToNext()) {
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
contactView.append("Name: ");
contactView.append(displayName);
contactView.append("\n");
}
}
295
www.IR-DL.com
)
+ " COLLATE LOCALIZED ASC";
296
www.IR-DL.com
Activity
297
www.IR-DL.com
Import
File
298
www.IR-DL.com
next
299
www.IR-DL.com
ok
300
www.IR-DL.com
WorkPlace
finish
301
www.IR-DL.com
Activity
VB C#
.
Activity
.
Activity
302
www.IR-DL.com
)
( testActivity).
main.xml
<Button
android:id="@+id/button1"
android:layout_width="280dp"
android:layout_height="wrap_content"
android:text="Open" />
</LinearLayout>
303
www.IR-DL.com
Class
304
www.IR-DL.com
SuperClass
305
Finish
www.IR-DL.com
Activity
onCreate
Ctrl+Space
onCreate
.
306
www.IR-DL.com
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
}
307
Xml
www.IR-DL.com
308
www.IR-DL.com
widget
main .Xml
309
www.IR-DL.com
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</FrameLayout>
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CheckBox" />
<ProgressBar
android:id="@+id/progressBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progressBar2"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="278dp"
android:layout_height="wrap_content" />
</LinearLayout>
SecondActivity
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
}
310
www.IR-DL.com
2
1
.
311
Add
www.IR-DL.com
Activity
.
312
www.IR-DL.com
.
.
import
import
import
import
import
import
TestActivityActivity
android.app.Activity;
android.content.Intent;
android.os.Bundle;
android.view.View;
android.view.View.OnClickListener;
android.widget.Button;
313
www.IR-DL.com
314
www.IR-DL.com
View .
Tuch
.
interface
Tuch
MotionEvent
, interface
tuch
MotionEvent
.
Activity
Tuch
onTouchEvent()
True
Event
Boolean
False
Tuch
getY()
Tuch
override
Event
.
getX()
.
.
getAction()
Event
Description
MotionEvent.ACTION_DOWN
MotionEvent.ACTION_MOVE
Finger is moving
315
www.IR-DL.com
Event
Description
MotionEvent.ACTION_UP
Finger went up
SingleTouch
SingleTouch
SingleTouch
SingleTouchEventView
package de.vogella.android.touch.single;
import
import
import
import
import
import
import
import
android.content.Context;
android.graphics.Canvas;
android.graphics.Color;
android.graphics.Paint;
android.graphics.Path;
android.util.AttributeSet;
android.view.MotionEvent;
android.view.View;
316
www.IR-DL.com
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
// nothing to do
break;
default:
return false;
}
// Schedules a repaint.
invalidate();
return true;
}
}
SingleTouchView
package de.vogella.android.touch.single;
import android.app.Activity;
import android.os.Bundle;
public class SingleTouchView extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new SingleTouchEventView(this, null));
}
}
.
.
317
emulator
www.IR-DL.com
)
:
emulator
318
www.IR-DL.com
)
ScaleGestureDetector
widget
ScaleGestureDetector
.
Package Name: de.vogella.android.touch.scaledetector
Activity: ScaleDetectorTest
.
ImageViewWithZoom
package de.vogella.android.touch.scaledetector;
import
import
import
import
import
import
android.content.Context;
android.graphics.Canvas;
android.graphics.drawable.Drawable;
android.view.MotionEvent;
android.view.ScaleGestureDetector;
android.view.View;
319
www.IR-DL.com
)
image.draw(canvas);
canvas.restore();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
invalidate();
return true;
}
private class ScaleListener extends
ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 5.0f));
invalidate();
return true;
}
}
}
ScaleDetectorTest
package de.vogella.android.touch.scaledetector;
import android.app.Activity;
import android.os.Bundle;
public class ScaleDetectorTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new ImageViewWithZoom(this));
}
}
.
320
www.IR-DL.com
(SMS , MMS)
SMS
SMS
.
.
321
www.IR-DL.com
.
.
.
14
Api
.
.
.
sms
Main.Xml
AndroidManifest.xml
<uses-permission android:name="android.permission.SEND_SMS"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
322
www.IR-DL.com
<activity
android:label="@string/app_name"
android:name=".SMSActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Java
package net.learn2develop.SMS;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SMSActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn=(Button)findViewById(R.id.btnSendSMS);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
sendSMS("5556", "Helo My Friend");
}
});
}
//---sends an SMS message to another device--private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);
}
}
:
permissions
sms
323
www.IR-DL.com
)
.
.
AndroidManifest.xml
SmsManager
.
.
SmsManager
getDefault()
sendTextMessage()
//---sends an SMS message to another device--private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);
sendTextMessage
:
SMSC
destinationAddress
Null
scAddress
: text
sentIntent
deliveryIntent
PendingIntent
.
324
www.IR-DL.com
)
java
package net.learn2develop.SMS;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SMSActivity extends Activity {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI, deliveredPI;
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnsen=(Button)findViewById(R.id.btnSendSMS);
btnsen.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
sendSMS("5556", "Helo My Friend");
}
});
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
}
@Override
public void onResume() {
super.onResume();
//---create the BroadcastReceiver when the SMS is sent--smsSentReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(),"SMS sent",
Toast.LENGTH_SHORT).show();
break;
325
www.IR-DL.com
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(),"Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(),"No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(),"Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(),"Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
};
//---create the BroadcastReceiver when the SMS is delivered--smsDeliveredReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(),"SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(),"SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
};
//---register the two BroadcastReceivers--registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
}
@Override
public void onPause() {
super.onPause();
//---unregister the two BroadcastReceivers--unregisterReceiver(smsSentReceiver);
unregisterReceiver(smsDeliveredReceiver);
}
//---sends an SMS message to another device--private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
326
www.IR-DL.com
PendingIntent
onCreate()
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
broadcasts
(SMS_DELIVERED)
BroadcastReceivers
SMS_DELIVERED
delivered
BroadcastReceivers.
intents
SMS_SENT
SMS_SENT
:onResume()
(Listen)
override , onReceive()
BroadcastReceiver
sendTextMessage()
.
.
327
www.IR-DL.com
)
MIME
Intent
Intent i = new
Intent(android.content.Intent.ACTION_VIEW);
i.putExtra("address", "5556; 5558; 5560");
i.putExtra("sms_body", "Hello my friends!" );
i.setType("vnd.android-dir/mms-sms");
startActivity(i);
328
vnd.android-dir/mms-sms
www.IR-DL.com
BroadcastReceiver
.
.
.
AndroidManifest.xml
SMSReceiver
329
:1
www.IR-DL.com
)
.
package net.learn2develop.SMS;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in--Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "SMS from ";
if (bundle != null)
{
//---retrieve the SMS message received--Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
if (i==0) {
//---get the sender address/phone number--str += msgs[i].getOriginatingAddress();
str += ": ";
}
//---get the message body--str += msgs[i].getMessageBody().toString();
}
//---display the new SMS message--Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
}
}
}
DDMs
Toast
330
www.IR-DL.com
.
.
331
www.IR-DL.com
<receiver android:name=".SMSReceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
.
abortBroadcast()
package net.learn2develop.SMS;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in--Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "SMS from ";
332
BroadcastReceiver
www.IR-DL.com
if (bundle != null)
{
//---retrieve the SMS message received--Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
if (i==0) {
//---get the sender address/phone number--str += msgs[i].getOriginatingAddress();
str += ": ";
}
//---get the message body--str += msgs[i].getMessageBody().toString();
}
//---display the new SMS message--Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
Log.d("SMSReceiver", str);
this.abortBroadcast();
}
}
}
333
www.IR-DL.com
)
BroadcastReceiver
.
.
Textview
main.xml
package net.learn2develop.SMS;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in--Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
334
www.IR-DL.com
SMSActivity.java
package net.learn2develop.SMS;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.TextView;
public class SMSActivity extends Activity {
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI, deliveredPI;
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;
IntentFilter intentFilter;
private BroadcastReceiver intentReceiver = new BroadcastReceiver() {
335
www.IR-DL.com
@Override
public void onReceive(Context context, Intent intent) {
//---display the SMS received in the TextView--TextView SMSes = (TextView) findViewById(R.id.textView1);
SMSes.setText(intent.getExtras().getString("sms"));
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnsen=(Button)findViewById(R.id.btnSendSMS);
btnsen.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
sendSMS("5556", "Helo My Friend");
}
});
sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
intentFilter = new IntentFilter();
intentFilter.addAction("SMS_RECEIVED_ACTION");
}
@Override
public void onResume() {
super.onResume();
registerReceiver(intentReceiver, intentFilter);
//---create the BroadcastReceiver when the SMS is sent--smsSentReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(),"SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(),"Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(),"No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(),"Null PDU",
Toast.LENGTH_SHORT).show();
break;
336
www.IR-DL.com
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(),"Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
};
//---create the BroadcastReceiver when the SMS is delivered--smsDeliveredReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(),"SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(),"SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
};
//---register the two BroadcastReceivers--registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
}
@Override
public void onPause() {
super.onPause();
//---unregister the two BroadcastReceivers--unregisterReceiver(intentReceiver);
unregisterReceiver(smsSentReceiver);
unregisterReceiver(smsDeliveredReceiver);
}
//---sends an SMS message to another device--private void sendSMS(String phoneNumber, String message)
{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}
}
DDms
337
www.IR-DL.com
338
www.IR-DL.com
Location-Based Services
.
:1
Zoom
:2
MapView
Switch :3
:4
.
location-based services
LBS.
LBS.
..
LBS
.
339
www.IR-DL.com
.
.
LocationManager
14
.
340
Api
www.IR-DL.com
)
.
.
View
:1
:2
:3
:4
LBS.
341
www.IR-DL.com
.
.
.
cmd
.
342
www.IR-DL.com
343
www.IR-DL.com
.
keytool.exe -list -alias androiddebugkey -keystore
"C:\Users\Mehrdad\.android\debug.keystore " -storepass android
-keypass android v
344
cmd
www.IR-DL.com
https://developers.google.com/android/maps-api-signup
(
).
345
www.IR-DL.com
)
.
.
.
346
Ip
www.IR-DL.com
Past
Cmd
button
Main.Xml
.
347
www.IR-DL.com
)
main.Xml
AndroidManifest.xml
.
package net.learn2develop.LBS;
import com.google.android.maps.MapActivity;
import android.os.Bundle;
public class LBSActivity extends MapActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
348
MapActivity
www.IR-DL.com
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
349
www.IR-DL.com
)
:
manifest
permission
INTERNET
<uses-permission android:name="android.permission.INTERNET"/>
main
widget
<com.google.android.maps.MapView
android:layout_width= fill_parent
android:layout_height= fill_parent
android:apiKey= 0vl7f6ejoFLHJx891E-togHA0FNbugpAAmbLovw
/>
MapActivity
LBSActivity
MapActivity
isRouteDisplayed().
True
False
extend
.
.
.
Google Maps API
emulator,
350
www.IR-DL.com
Api 14
351
ComboBox
www.IR-DL.com
Zoom
LBSActivity
Main.Xml
.
</LinearLayout>
package net.learn2develop.LBS;
import android.os.Bundle;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
public class LBSActivity extends MapActivity {
/** Called when the activity is first created. */
MapView mapView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.MapView);
mapView.setBuiltInZoomControls(true);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
352
www.IR-DL.com
353
www.IR-DL.com
)
Zoom
.
Zoom
.
package net.learn2develop.LBS;
import android.os.Bundle;
import com.google.android.maps.MapController;
import android.view.KeyEvent;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
public class LBSActivity extends MapActivity {
/** Called when the activity is first created. */
MapView mapView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.MapView);
mapView.setBuiltInZoomControls(true);
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
MapController mc = mapView.getController();
switch (keyCode)
{
case KeyEvent.KEYCODE_3:
mc.zoomIn();
break;
case KeyEvent.KEYCODE_1:
mc.zoomOut();
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
3 1
zoom
.
:
354
www.IR-DL.com
)
.
ZoomOut
ZoomIn
View
MapView
.
View
.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.MapView);
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(true);
}
355
MapView
setSatellite()
www.IR-DL.com
setTraffic()
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.MapView);
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(true);
mapView.setTraffic(true);
}
356
www.IR-DL.com
357
www.IR-DL.com
(Adding Markers)
Gif
.
358
res/drawable-mdpi
www.IR-DL.com
LBSActivity
package net.learn2develop.LBS;
import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.os.Bundle;
import android.view.KeyEvent;
public class LBSActivity extends MapActivity {
359
www.IR-DL.com
MapView mapView;
MapController mc;
GeoPoint p;
private class MapOverlay extends com.google.android.maps.Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView,
boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
//---translate the GeoPoint to screen pixels--Point screenPts = new Point();
mapView.getProjection().toPixels(p, screenPts);
//---add the marker--Bitmap bmp = BitmapFactory.decodeResource(
getResources(), R.drawable.pushpin);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);
return true;
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.MapView);
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(true);
mapView.setTraffic(true);
mc = mapView.getController();
String coordinates[] = {"1.352566007", "103.78921587"};
double lat = Double.parseDouble(coordinates[0]);
double lng = Double.parseDouble(coordinates[1]);
p = new GeoPoint(
(int) (lat * 1E6),
(int) (lng * 1E6));
mc.animateTo(p);
mc.setZoom(13);
//---Add a location marker--MapOverlay mapOverlay = new MapOverlay();
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
mapView.invalidate();
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
MapController mc = mapView.getController();
switch (keyCode)
{
case KeyEvent.KEYCODE_3:
mc.zoomIn();
break;
360
www.IR-DL.com
case KeyEvent.KEYCODE_1:
mc.zoomOut();
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
361
www.IR-DL.com
Overlay
Extend
.
pushpin
Override
draw()
MapOverlay
.
(GeoPoint
)
:
.
.
362
50
www.IR-DL.com
MapOverlay
MapView
363
overlays
www.IR-DL.com
,
Android and BlueCove JSR-82..
:
:1
.
J2ME, OS X, Linux, and Windows,
:3
jsr
.
364
JSR-82:2
www.IR-DL.com
)
Client/Server or Peer-to-Peer
.
discovery
.
.
:1
(peer)
( peers)|
.
.
.
365
:2
www.IR-DL.com
)
/
.
(Discovery)
.
Discovery
(Known address)
.
(connection-oriented)
RFCOMM .
: Btspp
btspp
:Address
12
: Port
:
btspp://0012D25ABDE4:3
(Known service)
(email, chat, etc.)
.
366
www.IR-DL.com
URL
Discovery
: UUID
16
128
:Server
UUID
.
:Client
UUID
Discovery
URLs
URL
JSR 82
Windows/Mac
Jar
BlueCove
Windows - A
BlueCove jar
www.IR-DL.com
)
OS X
OS X
BlueCove jar
Os X
.
homepages.ius.edu/rwisman/C490/html/JavaBlueToothRemoteDiscovery.zip
.
ommand prompt
JavaBlueToothRemoteDiscovery
Os X
java -classpath bin:bluecove-2.1.0.jar -d32 RemoteDeviceDiscovery
RFCOMM
TCP
RFCOMM
.
368
www.IR-DL.com
(0012D25ABDE4
.
Client
import java.io.*;
import javax.microedition.io.*;
import javax.bluetooth.*;
public class RFCOMMClient {
public static void main( String args[] ) {
try {
StreamConnection conn =
// block for connect
(StreamConnection)
Connector.open("btspp://0012D25ABDE4:3");
DataOutputStream out = new DataOutputStream(
conn.openOutputStream());
DataInputStream in = new DataInputStream(
conn.openInputStream());
out.writeUTF("Hello");
// Write server
www.IR-DL.com
}
}
Server
import java.io.*;
import javax.microedition.io.*;
import javax.bluetooth.*;
public class RFCOMMServer {
public static void main(String args[]) {
try {
StreamConnectionNotifier service =
(StreamConnectionNotifier)
Connector.open("btspp://localhost:"
+ new UUID("0000110100001000800000805F9B34FB",
false).toString() + ";name=helloService");
StreamConnection conn =
// block for connect
(StreamConnection) service.acceptAndOpen();
System.out.println("Connected");
DataInputStream in = new DataInputStream(
conn.openInputStream());
DataOutputStream out = new DataOutputStream(
conn.openOutputStream());
String received = in.readUTF();
conn.close();
service.close();
} catch (IOException e) {
System.err.print(e.toString());
}
}
Echo: Hello
0000110100001000800000805F9B34FB
370
UUID
helloService
www.IR-DL.com
)
:
3
:
:1
URL
LOcalHost
: Uuid
Id
URL
:2
:3
StreamConnection conn = (StreamConnection) service.acceptAndOpen();
.
.
discovery
.
AndroidManifest.xml
uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
371
www.IR-DL.com
AndroidBluetoothEchoClientActivity.java
package edu.ius.rwisman.AndroidBluetoothEchoClient;
import
import
import
import
import
import
import
import
import
import
import
java.io.DataInputStream;
java.io.DataOutputStream;
java.util.UUID;
android.app.ListActivity;
android.bluetooth.BluetoothAdapter;
android.bluetooth.BluetoothDevice;
android.bluetooth.BluetoothSocket;
android.os.Bundle;
android.os.Handler;
android.widget.LinearLayout;
android.widget.ArrayAdapter;
372
www.IR-DL.com
373
www.IR-DL.com
mBluetoothAdapter.cancelDiscovery();
discovery slows connection
// Cancel,
clientSocket.connect();
DataInputStream in =
new
DataInputStream(clientSocket.getInputStream());
DataOutputStream out =
new
DataOutputStream(clientSocket.getOutputStream());
out.writeUTF("Hello");
// Send
to server
data = in.readUTF();
// Read from
server
handler.post( updateUI );
} catch (Exception e) {}
}
}
.
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
374
www.IR-DL.com
ndroidBluetoothEchoServerActivity.java
package edu.ius.rwisman.AndroidBluetoothEchoServer;
import
import
import
import
import
import
import
import
import
import
import
import
java.io.DataInputStream;
java.io.DataOutputStream;
java.util.UUID;
android.app.ListActivity;
android.bluetooth.BluetoothAdapter;
android.bluetooth.BluetoothServerSocket;
android.bluetooth.BluetoothSocket;
android.os.Bundle;
android.os.Handler;
android.util.Log;
android.widget.LinearLayout;
android.widget.ArrayAdapter;
375
www.IR-DL.com
)
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
public String getBluetoothServer() {
return data;
}
public void run() {
BluetoothServerSocket serverSocket;
BluetoothSocket socket = null;
try {
serverSocket =
mBluetoothAdapter.listenUsingRfcommWithServiceRecord
("helloService",
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket = serverSocket.accept();
// block for
connect
data = "Accept connection";
handler.post(updateUI);
DataInputStream in = new
DataInputStream(socket.getInputStream());
DataOutputStream out = new
DataOutputStream(socket.getOutputStream());
data = in.readUTF();
out.writeUTF("Echo "+data);
// Send to client
handler.post(updateUI);
Log.d("EchoServer", data);
serverSocket.close();
socket.close();
} catch (Exception e) {}
}
}
376
// Log message
www.IR-DL.com
Android Client
mBluetoothAdapter =
Android Server
mBluetoothAdapter =
BluetoothAdapter.getDefaultAdapter();
BluetoothAdapter.getDefaultAdapter();
getRemoteDevice("28:CF:DA:D6:41:5D");
listenUsingRfcommWithServiceRecord("helloS
try {
ervice",
// UUID string same used by server
UUID.fromString(
clientSocket =
"00001101-0000-1000-8000mmDevice.createRfcommSocketToServiceRe 00805F9B34FB"));
cord(
UUID.fromString(
socket = serverSocket.accept(); // block
"00001101-0000-1000-8000for connect
00805F9B34FB"));
DataInputStream in =
mBluetoothAdapter.cancelDiscovery();
new
DataInputStream(socket.getInputStream());
clientSocket.connect();
DataOutputStream out =
new
377
www.IR-DL.com
DataInputStream in =
DataOutputStream(socket.getOutputStream());
new
DataInputStream(clientSocket.getInputStrea
data = in.readUTF(); // Read from client
m());
DataOutputStream out =
out.writeUTF("Echo "+data); // Send to
new
client
DataOutputStream(clientSocket.getOutputStr
eam());
handler.post(updateUI);
out.writeUTF("Hello");
Send to server
//
.
priori
StreamConnection conn = (StreamConnection) Connector.open("btspp://0012D25ABDE4:3");
jsr
helloService
378
Url
www.IR-DL.com
)
btspp://0012D25ABDE4:3
BluetoothEchoClient.java
import
import
import
import
java.io.*;
javax.bluetooth.*;
javax.microedition.io.Connector;
javax.microedition.io.StreamConnection;
379
www.IR-DL.com
StreamConnection conn =
connect
(StreamConnection) Connector.open(url);
// block for
// Send server
// Read server
conn.close();
} catch (Exception e) {
System.out.print("Exception: " + e.toString() + "\n");
}
}
}
UUID
380
www.IR-DL.com
)
Device Discovery
.
.
.
:
.
(Vector)
devicesDiscovered
inquiryCompletedEvent
.
DiscoveryListener
JSR 82
.
1.
2.
3.
4.
DiscoveryListener
2 1
import java.io.IOException;
import java.util.Vector;
import javax.bluetooth.*;
public class RemoteDeviceDiscovery {
public static final Vector <RemoteDevice> devicesDiscovered = new Vector();
public static void main(String[] args) throws IOException, InterruptedException {
final Object inquiryCompletedEvent = new Object();
381
www.IR-DL.com
devicesDiscovered.clear();
DiscoveryListener listener = new DiscoveryListener() {
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
System.out.println("Device " + btDevice.getBluetoothAddress() + " found");
devicesDiscovered.addElement( btDevice );
try {
System.out.println(" name " + btDevice.getFriendlyName(false));
} catch (IOException cantGetDeviceName) {
}
}
public void inquiryCompleted(int discType) {
System.out.println("Device Inquiry completed!");
synchronized(inquiryCompletedEvent){
inquiryCompletedEvent.notifyAll();
}
}
public void serviceSearchCompleted(int transID, int respCode) {}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) { }
};
synchronized(inquiryCompletedEvent) {
boolean started = LocalDevice.getLocalDevice().getDiscoveryAgent().
startInquiry(DiscoveryAgent.GIAC, listener);
if (started) {
System.out.println("wait for device inquiry to complete...");
inquiryCompletedEvent.wait();
System.out.println(devicesDiscovered.size() + " device(s) found");
}
}
}
}
:
wait for device inquiry to complete...
Device 40FC898CE2B7 found
name Xoom
Device Inquiry completed!
1 device(s) found
382
www.IR-DL.com
Try
1. Save the above file as:
RemoteDeviceDiscovery.java
2. Compile and execute by:
javac -classpath bluecove-2.1.0.jar RemoteDeviceDiscovery.java
java -classpath .;bluecove-2.1.0.jar RemoteDeviceDiscovery
3. If the search takes too long (more than a minute or two), terminate by Ctrl C.
.
.
.
:1
:2
:3
AndroidManifest.xml
AndroidRemoteDiscovery.java
package edu.ius.rwisman.AndroidRemoteDiscovery;
import
import
import
import
import
import
android.app.ListActivity;
android.bluetooth.BluetoothAdapter;
android.bluetooth.BluetoothDevice;
android.content.BroadcastReceiver;
android.content.Context;
android.content.Intent;
383
www.IR-DL.com
(
import
import
import
import
android.content.IntentFilter;
android.os.Bundle;
android.widget.ArrayAdapter;
java.util.Set;
// Blocks
if (pairedDevices.size() > 0) {
mArrayAdapter.add("Paired devices");
for (BluetoothDevice device : pairedDevices)
mArrayAdapter.add(device.getName() + "\n" +
// Display name and address
device.getAddress());
}
mArrayAdapter.add("Discovered devices");
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
// BroadcastReceiver for ACTION_FOUND
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// When discovery finds a device
// Get the BluetoothDevice object from the Intent
BluetoothDevice device =
intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
384
www.IR-DL.com
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="edu.ius.rwisman.AndroidRemoteDiscovery"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="13" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AndroidRemoteDiscoveryActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
385
www.IR-DL.com
www.IR-DL.com
out.writeUTF("Hello");
// Write server
String received = in.readUTF(); // Read server
System.out.println(received);
conn.close();
}
catch ( IOException e ) { System.err.print(e.toString()); }
}
}
UUID
UUID
UUID
( 128-bit)
( 16- or 32-bit)
UUID
.
UUID
387
www.IR-DL.com
Client
1.
2.
3.
4.
5.
6.
Android SDP
Mac
helloService
.
.
SDP
388
UUID
helloService UUID
www.IR-DL.com
)
.
:1
.
:2
:3
:4
389
www.IR-DL.com
AndroidSDPHelloServiceClientActivity.java
package edu.ius.rwisman.AndroidSDPHelloServiceClient;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
java.io.DataInputStream;
java.io.DataOutputStream;
java.util.Set;
java.util.UUID;
java.util.Vector;
android.app.ListActivity;
android.bluetooth.BluetoothAdapter;
android.bluetooth.BluetoothDevice;
android.bluetooth.BluetoothSocket;
android.content.Intent;
android.os.Bundle;
android.os.Handler;
android.util.Log;
android.widget.LinearLayout;
android.widget.ArrayAdapter;
390
www.IR-DL.com
BluetoothClient bluetoothClient;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mArrayAdapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1);
this.setListAdapter(mArrayAdapter);
BluetoothAdapter mBluetoothAdapter =
BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) mArrayAdapter.add("Device does not
support Bluetooth");
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
Set pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
mArrayAdapter.add("Paired devices");
for (BluetoothDevice device : pairedDevices) {
// Loop through paired devices
// Display name and address
mArrayAdapter.add(device.getName() + "\n" +
device.getAddress());
bluetoothDevices.add(device);
list of paired devices
}
}
// Build
391
www.IR-DL.com
)
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
public String getBluetoothClientData() {
return data;
}
public void run() {
BluetoothSocket clientSocket = null;
Boolean connection = false;
// Client discovers the MAC address of server, if one exists
for (BluetoothDevice device : bluetoothDevices)
try {
Log.d("EchoSDP Client", device.getName());
clientSocket =
device.createRfcommSocketToServiceRecord(UUID
.fromString("0BAE0D0C-0B0A-0009-5570605040302011"));
clientSocket.connect();
// Try
connection, exception if fails.
connection = true;
break;
}
catch(Exception e) {
Log.d("Hello Service fail: ",
device.getName());
}
mBluetoothAdapter.cancelDiscovery(); // Cancel, discovery
slows connection
if(connection)
try {
DataInputStream in = new DataInputStream(
clientSocket.getInputStream());
DataOutputStream out = new
DataOutputStream(clientSocket.getOutputStream());
out.writeUTF("Hello");
// Send to server
data = in.readUTF();
// Read from server
handler.post(updateUI);
clientSocket.close();
} catch (Exception e) {}
else {
data = "Server not found";
handler.post(updateUI);
}
}
}
392
www.IR-DL.com
)
Device Discovery
RemoteDeviceDiscovery
.
devicesDiscovered
helloService
UUID
searchServices()
UUID
JSR 82,
0x1101
BlueCove
.
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;
import javax.bluetooth.*;
public class ServicesSearch {
static final UUID HELLO_SERVICE = new UUID(0x1101);
public static final Vector<String> serviceFound = new Vector();
public static void main(String[] args) throws IOException, InterruptedException {
UUID[] searchUuidSet = new UUID[] { HELLO_SERVICE };
int[] attrIDs = new int[] { 0x0100 }; // Service name
RemoteDeviceDiscovery.main(null); // First run RemoteDeviceDiscovery and use
discovered devices
serviceFound.clear();
final Object serviceSearchCompletedEvent = new Object();
DiscoveryListener listener = new DiscoveryListener() {
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) { }
public void inquiryCompleted(int discType) { }
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
for (int i = 0; i < servRecord.length; i++) {
393
UUID
www.IR-DL.com
String url =
servRecord[i].getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
if (url == null) { continue; }
serviceFound.add(url);
DataElement serviceName = servRecord[i].getAttributeValue(0x0100);
if (serviceName != null) {
System.out.println("service " + serviceName.getValue() + " found " + url);
} else {
System.out.println("service found " + url);
}
}
}
public void serviceSearchCompleted(int transID, int respCode) {
System.out.println("service search completed!");
synchronized( serviceSearchCompletedEvent ){
serviceSearchCompletedEvent.notifyAll();
}
}
};
for(Enumeration en = RemoteDeviceDiscovery.devicesDiscovered.elements();
en.hasMoreElements(); ) {
RemoteDevice btDevice = (RemoteDevice)en.nextElement();
synchronized( serviceSearchCompletedEvent ) {
System.out.println("search services on " + btDevice.getBluetoothAddress() + " " +
btDevice.getFriendlyName(false));
LocalDevice.getLocalDevice().getDiscoveryAgent().searchServices(attrIDs,
searchUuidSet, btDevice, listener);
serviceSearchCompletedEvent.wait();
}
}
}
}
394
www.IR-DL.com
Try
1. Copy the above file to:
o ServicesSearch.java
2. Compile by:
javac -classpath bluecove-2.1.0.jar ServicesSearch.java
3. Execute on two different machines by:
java -classpath .;bluecove-2.1.0.jar RFCOMMServer
java -classpath .;bluecove-2.1.0.jar ServicesSearch
4. The helloService should be displayed. Locate the address and port used by the service.
5. Edit RFCOMMClient.java line:
String url = "btspp://0012D25ABDE4:3";
changing the 0012D25ABDE4:3 to the address and port used by the helloService.
6. Compile and execute RFCOMMClient.
Peer-to-Peer (P2P)
.
p2p
:
395
SDP
www.IR-DL.com
)
.
.
p2p
AndroidP2P
public class AndroidP2P extends Activity {
Activity myActivity;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myActivity = this;
new BluetoothP2P(myActivity).start();
}
}
class BluetoothP2P extends Thread {
private static final int REQUEST_ENABLE_BT = 2;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket socket = null;
final UUID TTTSERVICE_ID = UUID.fromString("00001101-0000-1000-800000805F9B34FB");
Activity activity;
public BluetoothP2P(Activity activity) {
this.activity = activity;
this.mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
}
public void run() {
Boolean connection = false;
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(
BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(enableBtIntent,
REQUEST_ENABLE_BT);
}
Set pairedDevices = mBluetoothAdapter.getBondedDevices();
// Get all devices paired with this one.
mBluetoothAdapter.cancelDiscovery();
// Cancel, discovery slows connection
396
www.IR-DL.com
// Bre
if (connection) {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
// Cli
out.writeUTF("Hello");
String s = in.readUTF();
System.out.println( s );
} else {
BluetoothServerSocket serverSocket;
try {
serverSocket = mBluetoothAdapter
// Ser
.listenUsingRfcommWithServiceRecord("TTTService",
TTTSERVICE_ID);
socket = serverSocket.accept();
serverSocket.close();
in = new
DataInputStream(socket.getInputStream());
out = new
DataOutputStream(socket.getOutputStream());
String s = in.readUTF();
out.writeUTF("Echo: "+s);
System.out.println( s );
} catch (Exception e) {}
}
}
}
:
ConnectionListener
BluetoothP2P
:1
397
www.IR-DL.com
)
:2
(
.
ndroidSDPHelloServicePeerActivity.java
package edu.ius.rwisman.AndroidSDPHelloServicePeer;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
java.io.DataInputStream;
java.io.DataOutputStream;
java.util.Set;
java.util.UUID;
android.app.Activity;
android.app.ListActivity;
android.bluetooth.BluetoothAdapter;
android.bluetooth.BluetoothDevice;
android.bluetooth.BluetoothServerSocket;
android.bluetooth.BluetoothSocket;
android.content.Intent;
android.os.Bundle;
android.widget.LinearLayout;
android.widget.ArrayAdapter;
interface ConnectionListener {
public void setSocketServer(BluetoothSocket socket, boolean server);
public void setMessage(final String msg);
}
public class AndroidSDPHelloServicePeerActivity extends ListActivity
implements ConnectionListener {
LinearLayout layout;
private DataInputStream in = null;
private DataOutputStream out = null;
Activity myActivity;
private ArrayAdapter mArrayAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myActivity = this;
mArrayAdapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1);
398
www.IR-DL.com
)
this.setListAdapter(mArrayAdapter);
new BluetoothP2P(myActivity, this).start();
}
// ConnectionListener methods
public void setSocketServer(BluetoothSocket socket, boolean server) {
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
if( server )
doServer();
else doClient();
} catch (Exception e) {}
}
public void setMessage(final String s) {
// Callback on BluetoothP2P thread
myActivity.runOnUiThread(new Runnable() {
public void run() {
mArrayAdapter.add(s);
}
});
}
// Bluetooth Input/Output
private void doClient() {
new Thread(new Runnable() {
public void run() {
try {
out.writeUTF("Hello");
String s = in.readUTF();
setMessage(s);
} catch (Exception e) {}
}
}).start();
}
private void doServer() {
new Thread(new Runnable() {
public void run() {
try {
String s = in.readUTF();
out.writeUTF("Echo: "+s);
setMessage(s);
} catch (Exception e) {}
}
}).start();
}
}
class BluetoothP2P extends Thread {
private static final int REQUEST_ENABLE_BT = 2;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket socket = null;
Boolean server = true;
399
www.IR-DL.com
400
www.IR-DL.com
delegate.setSocketServer(socket, true);
// Call-back as a server
} catch (Exception e) {}
}
}
}
BluetoothEchoClient.java
401
www.IR-DL.com
(
import
import
import
import
java.io.*;
javax.bluetooth.*;
javax.microedition.io.Connector;
javax.microedition.io.StreamConnection;
402
www.IR-DL.com
)
.
Mehrdad.j1367@Gmail.com
:
Wrox
Android
http://www.vogella.com/android.html
403
www.IR-DL.com