الجمعة، 26 يونيو 2015

Android Developer Tools (ADT) in Eclipse will end at the end of the year

Google are ending development and official support for the Android Developer Tools (ADT) in Eclipse at the end of the year. This specifically includes the Eclipse ADT plugin and Android Ant build system.

source: Android Developers Blog - An update on Eclipse Android Developer Tools


#andproud

Join the global online Pride parade June 27th to 28th! Create & add your character before June 27th.
#andproud



https://www.androidify.com/en/#/gallery/a66e07cf24dd1c34a25f65f29f38b319


Import Android code sample of BluetoothChat to Android Studio


The Android code sample of BluetoothChat shows how to implement two-way text chat over Bluetooth between two Android devices, using all the fundamental Bluetooth API capabilities.

The sample demonstrates the following, using the Bluetooth API:

  • Setting up Bluetooth
  • Scanning for other Bluetooth devices
  • Querying the local Bluetooth adapter for paired Bluetooth devices
  • Establishing RFCOMM channels/sockets
  • Connecting to a remote device
  • Transfering data over Bluetooth

This video show how to import the Android code sample of BluetoothChat to Android Studio.



updated@2016-04-29:
I re-tried this example and found problem: refer "Problem of BluetoothChat example".


Related:
- Test HC-06 Bluetooth Module with Android BluetoothChat

الأربعاء، 24 يونيو 2015

Display Donut Chart on Android WebView, using Google Charts


My former post show how to display Google Charts on Android WebView, with Capture image. To display Donut Chart (Pie Chart with pie hole), simple modify the HTML file of pie chart (/assets/pie_chart.html) to add options of pieHole.

Example:

// Set chart options
var options = {
title:'Android-er: Google Charts example of Pie/Donut chart',
pieHole: 0.4,
};


AlarmManager trigger BroadcastReceiver, then start another activity to generate Ringtone

This example show how to choice date/time with DatePicker and TimePicker, then set AlarmManager to trigger BroadcastReceiver on specified date/time, then start another activity to generate Ringtone using RingtoneManager.




com.example.androidringtone.MainActivity.java
package com.example.androidringtone;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import java.util.Calendar;

public class MainActivity extends ActionBarActivity {

DatePicker datePicker;
TimePicker timePicker;

RadioButton optAlarm, optNotification, optRingtone;
RadioButton optRingTonePicker;
Button btnStart;
TextView info;

Ringtone ringTone;

Uri uriAlarm, uriNotification, uriRingtone;

final static int RQS_RINGTONEPICKER = 1;

final static int RQS_1 = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

datePicker = (DatePicker)findViewById(R.id.datepicker);
timePicker = (TimePicker)findViewById(R.id.timepicker);

optAlarm = (RadioButton)findViewById(R.id.optAlarm);
optNotification = (RadioButton)findViewById(R.id.optNotification);
optRingtone = (RadioButton)findViewById(R.id.optRingtone);
optRingTonePicker = (RadioButton)findViewById(R.id.optPicker);
btnStart = (Button)findViewById(R.id.start);
info = (TextView)findViewById(R.id.info);

uriAlarm = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
uriNotification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
uriRingtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
optAlarm.setText("uriAlarm: " + uriAlarm);
optNotification.setText("uriNotification: " + uriNotification);
optRingtone.setText("uriRingtone: " + uriRingtone);

btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {

if (optAlarm.isChecked()) {
setAlarm(uriAlarm);
} else if (optNotification.isChecked()) {
setAlarm(uriNotification);
} else if (optRingtone.isChecked()) {
setAlarm(uriRingtone);
} else if (optRingTonePicker.isChecked()) {
startRingTonePicker();
}

}
});

}

private void startRingTonePicker(){
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
startActivityForResult(intent, RQS_RINGTONEPICKER);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == RQS_RINGTONEPICKER && resultCode == RESULT_OK){
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
setAlarm(uri);
}
}

private void setAlarm(Uri passuri){

Calendar cal = Calendar.getInstance();
cal.set(datePicker.getYear(),
datePicker.getMonth(),
datePicker.getDayOfMonth(),
timePicker.getCurrentHour(),
timePicker.getCurrentMinute(),
00);

String passString = passuri.toString();
info.setText("\n\n***\n"
+ "Alarm is set@ " + cal.getTime() + "\n"
+ "***\n"
+ "Uri: " + passString);

Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
intent.putExtra("KEY_TONE_URL", passString);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
getBaseContext(),
RQS_1,
intent,
PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
}
}


layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:orientation="horizontal"
tools:context=".MainActivity">

<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">

<DatePicker
android:id="@+id/datepicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"/>
<TimePicker
android:id="@+id/timepicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"/>

</LinearLayout>

<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />

<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<RadioButton
android:id="@+id/optAlarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alarm"
android:checked="true" />

<RadioButton
android:id="@+id/optNotification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notification" />

<RadioButton
android:id="@+id/optRingtone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ringtone" />

<RadioButton
android:id="@+id/optPicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACTION_RINGTONE_PICKER" />

</RadioGroup>

<Button
android:id="@+id/start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start"/>

<TextView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

</LinearLayout>


com.example.androidringtone.AlarmReceiver.java
package com.example.androidringtone;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class AlarmReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.

String uriString = intent.getStringExtra("KEY_TONE_URL");

Toast.makeText(context,
"Alarm received!\n"
+ "uriString: " + uriString,
Toast.LENGTH_LONG).show();

Intent secIntent = new Intent(context, SecondActivity.class);
secIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
secIntent.putExtra("SEC_RINGTONE_URI", uriString);
context.startActivity(secIntent);

}
}


com.example.androidringtone.SecondActivity.java
package com.example.androidringtone;

import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class SecondActivity extends ActionBarActivity {

TextView secInfo;
Button btnStop;

Ringtone ringTone;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
secInfo = (TextView)findViewById(R.id.secinfo);
btnStop = (Button)findViewById(R.id.stop);

String stringUri = getIntent().getStringExtra("SEC_RINGTONE_URI");
Uri uri = Uri.parse(stringUri);
secInfo.setText("uri: " + uri + "\n");

ringTone = RingtoneManager
.getRingtone(getApplicationContext(), uri);

secInfo.append(ringTone.getTitle(SecondActivity.this));

ringTone.play();

btnStop.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(ringTone != null){
ringTone.stop();
ringTone = null;
}
}
});

}

}


layout/activity_second.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp"
android:orientation="vertical"
tools:context="com.example.androidringtone.SecondActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />

<TextView
android:id="@+id/secinfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Stop"/>

</LinearLayout>


Modify src/main/AndroidManifest.xml to add receiver of ".AlarmReceiver" and activity of ".SecondActivity".
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.androidringtone" >

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver
android:name=".AlarmReceiver"
android:process=":remote" >
</receiver>

<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second" >
</activity>
</application>

</manifest>



download filesDownload the files (Android Studio Format).

download filesDownload the APK.

الثلاثاء، 23 يونيو 2015

Android and Java Setup for App Development on Ubuntu: Save Yourself a Few Hours

Android and Java Setup for App Development on Ubuntu: Save Yourself a Few Hours

Android and Java Setup for App Development on Ubuntu deals with installation/upgrade of Ubuntu, and then installation of Java and Android on Ubuntu, with the goal of doing Android App Development. Each software will be configured and interconnected, and then changes will be verified. Configuration includes settings in /etc/environment and how to recover from errors resulting in a login-loop. Configuration also includes use of MultiArch, dpkg, and apt-get to provide Android SDK-compatible libraries on 64-bit CPU systems. Installation of the full Oracle Java Development Kit is followed by setting this Java as the system default by using update-alternatives and the setting of alternatives-mode to manual. Integrated Development Environments (IDEs) include both Android/Studio and Android/Eclipse. Android SDK Manager adds packages and downloads components and platforms for emulation. All along, recommendations of reference sites are given for further research.

Android example using ACTION_RINGTONE_PICKER

This example show how to start another activity of RingTone Picker using ACTION_RINGTONE_PICKER intent, further works on last exercise "Generate Alarm, Notification and Ringtone using RingtoneManager".


com.example.androidringtone.MainActivity.java
package com.example.androidringtone;

import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

RadioButton optAlarm, optNotification, optRingtone;
RadioButton optRingTonePicker;
Button btnStart, btnStop;
Ringtone ringTone;

Uri uriAlarm, uriNotification, uriRingtone;

final int RQS_RINGTONEPICKER = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

optAlarm = (RadioButton)findViewById(R.id.optAlarm);
optNotification = (RadioButton)findViewById(R.id.optNotification);
optRingtone = (RadioButton)findViewById(R.id.optRingtone);
optRingTonePicker = (RadioButton)findViewById(R.id.optPicker);
btnStart = (Button)findViewById(R.id.start);
btnStop = (Button)findViewById(R.id.stop);

uriAlarm = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
uriNotification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
uriRingtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
optAlarm.setText("uriAlarm: " + uriAlarm);
optNotification.setText("uriNotification: " + uriNotification);
optRingtone.setText("uriRingtone: " + uriRingtone);

btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (ringTone != null) {
//previous ringTone is playing,
//stop it first
ringTone.stop();
}

if (optAlarm.isChecked()) {
ringTone = RingtoneManager
.getRingtone(getApplicationContext(), uriAlarm);
} else if (optNotification.isChecked()) {
ringTone = RingtoneManager
.getRingtone(getApplicationContext(), uriNotification);
} else if (optRingtone.isChecked()) {
ringTone = RingtoneManager
.getRingtone(getApplicationContext(), uriRingtone);
} else if (optRingTonePicker.isChecked()) {
startRingTonePicker();
return; //skip Toast to display RingTone title
}

Toast.makeText(MainActivity.this,
ringTone.getTitle(MainActivity.this),
Toast.LENGTH_LONG).show();
ringTone.play();
}
});

btnStop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(ringTone!=null){
ringTone.stop();
ringTone = null;
}
}
});
}

private void startRingTonePicker(){
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
startActivityForResult(intent, RQS_RINGTONEPICKER);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == RQS_RINGTONEPICKER && resultCode == RESULT_OK){
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
ringTone = RingtoneManager.getRingtone(getApplicationContext(), uri);
Toast.makeText(MainActivity.this,
ringTone.getTitle(MainActivity.this),
Toast.LENGTH_LONG).show();
ringTone.play();
}
}
}


layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />

<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<RadioButton
android:id="@+id/optAlarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Alarm"
android:checked="true" />

<RadioButton
android:id="@+id/optNotification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Notification" />

<RadioButton
android:id="@+id/optRingtone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ringtone" />

<RadioButton
android:id="@+id/optPicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACTION_RINGTONE_PICKER" />

</RadioGroup>

<Button
android:id="@+id/start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start"/>

<Button
android:id="@+id/stop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop"/>

</LinearLayout>