Cómo jugar radio en línea url de streaming en Android. Cómo jugar .pls radio streaming url en android

He creado un archivo XML en mi servidor. Contiene etiquetas de title y link . Obtengo las etiquetas y las muestro como enlaces en ListView . De ahí cuando el usuario haga clic en el enlace, entonces me gustaría reproducir el archivo. .pls en la aplicación Radio Station.

Aquí está mi archivo XML:

 <item> <title> Kushi FM </title> <link>http://108.163.197.114:8071/listen.pls</link> </item> 

No sé cómo jugar el enlace en la próxima actividad.

MainActivity :

 public class MainActivity extends AppCompatActivity { // All static variables static final String URL1 = "http://servernmae.com/stations"; // XML node keys static final String KEY_ITEM = "item"; // parent node static final String KEY_TITLE = "title"; static final String KEY_LINK = "link"; URL url; URLConnection urlConnection; //Context context; ListView listview; int images=R.drawable.radio; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // isNetworkAvailable(this); listview = (ListView) findViewById(R.id.list); if(isNetworkAvailable(this)) { new GetData().execute(); }else { Toast.makeText(getApplicationContext(), "Please Connect to Internet and Check Again ! Thanks)", Toast.LENGTH_LONG).show(); } } private boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { Log.w("INTERNET:",String.valueOf(i)); if (info[i].getState() == NetworkInfo.State.CONNECTED) { Log.w("INTERNET:", "connected!"); return true; } } } } return false; } class GetData extends AsyncTask<String, String, String> { String xml = "error"; @Override protected String doInBackground(String... params) { try { url = new URL(URL1); urlConnection = (HttpURLConnection) url.openConnection(); InputStream in = urlConnection.getInputStream(); InputStreamReader isw = new InputStreamReader(in); BufferedReader br = new BufferedReader(isw); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); xml = sb.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return xml; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); final ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); ArrayList<String> title= new ArrayList<>(); //title.add(""); Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); NodeList nl = doc.getElementsByTagName(KEY_ITEM); for (int i = 0; i < nl.getLength(); i++) { HashMap<String, String> map = new HashMap<String, String>(); Element e = (Element) nl.item(i); Log.e("TAg1", getValue(e, KEY_TITLE)); //Log.e("TAg2", getValue(e, KEY_LINK)); map.put(KEY_TITLE, getValue(e, KEY_TITLE)); map.put(KEY_LINK, getValue(e, KEY_LINK)); menuItems.add(map); title.add(getValue(e, KEY_TITLE)); } } catch (ParserConfigurationException e) { Log.e("Error: ", e.getMessage()); } catch (SAXException e) { Log.e("Error: ", e.getMessage()); } catch (IOException e) { Log.e("Error: ", e.getMessage()); } String[] dataArr = new String[title.size()]; dataArr = title.toArray(dataArr ); CustomAdapter adapter = new CustomAdapter(getApplicationContext(), dataArr ); listview.setAdapter(adapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //HashMap<String, String> selectedMap = menuItems.get(position); HashMap<String,String> selectedMap= menuItems.get(position); String urls = selectedMap.get(KEY_LINK); Intent intent = new Intent(MainActivity.this, Service_Player.class); intent.putExtra("url",urls); startActivity(intent); } }); } public final String getElementValue(Node elem) { Node child; if (elem != null) { if (elem.hasChildNodes()) { for (child = elem.getFirstChild(); child != null; child = child.getNextSibling()) { if (child.getNodeType() == Node.TEXT_NODE) { return child.getNodeValue(); } } } } return ""; } public String getValue(Element item, String str) { NodeList n = item.getElementsByTagName(str); return this.getElementValue(n.item(0)); } } 

Service_player.java

 public class Service_Player extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_service__player); startService(new Intent(this, MediaPlayerService.class)); String url = getIntent().getStringExtra("url"); if (!TextUtils.isEmpty(url)) startMediaPlayer(url); } @Override protected void onResume() { super.onResume(); registerReceiver(receiverFromservice, new IntentFilter(MediaPlayerService.SERVICE_TO_ACTIVITY)); } private String currentPlayerStatus = "N/A"; private BroadcastReceiver receiverFromservice = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (MediaPlayerService.SERVICE_TO_ACTIVITY.equalsIgnoreCase(action)) { /* * To get current status of player * */ currentPlayerStatus = intent.getStringExtra(MediaPlayerService.PLAYER_STATUS_KEY); Log.e("Player Mode", "" + currentPlayerStatus); } } }; @Override protected void onPause() { super.onPause(); unregisterReceiver(receiverFromservice); } public void startMediaPlayer(String url) { Intent intent = new Intent(); intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE); intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.PLAY_MEDIA_PLAYER); intent.putExtra(MediaPlayerService.PLAYER_TRACK_URL, url); sendBroadcast(intent); } 

MediaPlayerService.java

 public class MediaPlayerService extends Service { public static final String BROADCAST_TO_SERVICE = "com.mediaplayer.playerfunction"; public static final String SERVICE_TO_ACTIVITY = "com.mediaplayer.currentPlayerStatus"; public static final String PLAYER_FUNCTION_TYPE = "playerfunction"; public static final String PLAYER_TRACK_URL = "trackURL"; public static final int PLAY_MEDIA_PLAYER = 1; public static final int PAUSE_MEDIA_PLAYER = 2; public static final int RESUME_MEDIA_PLAYER = 3; public static final int STOP_MEDIA_PLAYER = 4; public static final int CHANGE_PLAYER_TRACK = 5; public static final String PLAYER_STATUS_KEY = "PlayerCurrentStatus"; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { IntentFilter intentFilter = new IntentFilter(BROADCAST_TO_SERVICE); registerReceiver(playerReceiver, intentFilter); if (mPlayer != null && mPlayer.isPlaying()) { sendPlayerStatus("playing"); } return START_STICKY; } private BroadcastReceiver playerReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BROADCAST_TO_SERVICE.equalsIgnoreCase(action)) { String trackURL = intent.hasExtra(PLAYER_TRACK_URL) ? intent.getStringExtra(PLAYER_TRACK_URL) : ""; int function = intent.getIntExtra(PLAYER_FUNCTION_TYPE, 0); switch (function) { case CHANGE_PLAYER_TRACK: changeTrack(trackURL); break; case STOP_MEDIA_PLAYER: stopPlayer(); break; case PLAY_MEDIA_PLAYER: startMediaPlayer(trackURL); break; case PAUSE_MEDIA_PLAYER: pausePlayer(); break; case RESUME_MEDIA_PLAYER: resumePlayer(); break; } } } }; private MediaPlayer mPlayer; private void pausePlayer() { if (mPlayer != null && mPlayer.isPlaying()) { mPlayer.pause(); sendPlayerStatus("pause"); } } private void resumePlayer() { if (mPlayer != null && !mPlayer.isPlaying()) { mPlayer.start(); sendPlayerStatus("playing"); } } private void changeTrack(String url) { stopPlayer(); startMediaPlayer(url); } private void stopPlayer() { if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = null; sendPlayerStatus("stopped"); } } public void startMediaPlayer(String url) { if (TextUtils.isEmpty(url)) return; if (mPlayer == null) mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(url); mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (extra == MediaPlayer.MEDIA_ERROR_SERVER_DIED || extra == MediaPlayer.MEDIA_ERROR_MALFORMED) { sendPlayerStatus("erroronplaying"); } else if (extra == MediaPlayer.MEDIA_ERROR_IO) { sendPlayerStatus("erroronplaying"); return false; } return false; } }); mPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { public void onBufferingUpdate(MediaPlayer mp, int percent) { Log.e("onBufferingUpdate", "" + percent); } }); mPlayer.prepareAsync(); mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mPlayer.start(); sendPlayerStatus("playing"); } }); mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Log.e("onCompletion", "Yes"); sendPlayerStatus("completed"); } }); mPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { return false; } }); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void sendPlayerStatus(String status) { Intent intent = new Intent(); intent.setAction(SERVICE_TO_ACTIVITY); intent.putExtra(PLAYER_STATUS_KEY, status); sendBroadcast(intent); } 

Manifest.xml

 <!-- Internet Permissions --> <uses-permission android:name="android.permission.INTERNET" /> <!-- Network State Permissions --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <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> <activity android:name=".Service_Player" android:label="@string/title_activity_service__player" > </activity> <service android:name=".MediaPlayerService"></service> </application> 

Le sugeriré que utilice el Servicio si está creando una aplicación con MediaPlayer streaming o MediaPlayer normal. Será fácil manejar fondo del jugador y centralmente.

Para utilizar el reproductor de medios en el servicio que puede utilizar con BroadCastReceiver o Bound Service según su requirement.It sería bueno si MediaPlayer relacionados con el servicio si mantenerlo en ejecución en primer plano aquí en código por debajo no he manejar para que compruebe por favor el enlace dado .

Aquí, en el código de ejemplo, he utilizado BroadCast Receiver para enviar comando de Activity to Service para MediaPlayer (como reproducir, pausar, cambiar de pista, etc) y viceversa.

Ahora, para obtener url que está enviando desde la Actividad onItemClickListner, debe obtener de Intent.

 String url = getIntent().getStringExtra("url"); 

PlayerScreen

  public class PlayerScreen extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.player); startService(new Intent(this, MediaPlayerService.class)); findViewById(R.id.btnChangeTrack).setOnClickListener(clickListener); findViewById(R.id.btnStartMediaPlayer).setOnClickListener(clickListener); findViewById(R.id.btnStopMediaPlayer).setOnClickListener(clickListener); ToggleButton toggleButton = (ToggleButton) findViewById(R.id.togglePauseResume); toggleButton.setOnCheckedChangeListener(checkedChangeListener); /* * To get url which is passing from the previous activity listitem click. * If url which is pass from listitem click is not empty it will start player * */ String url = getIntent().getStringExtra("url"); if (!TextUtils.isEmpty(url)) startMediaPlayer(url); } private ToggleButton.OnCheckedChangeListener checkedChangeListener = new ToggleButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (!isChecked) { Intent intent = new Intent(); intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE); intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.PAUSE_MEDIA_PLAYER); sendBroadcast(intent); } else { Intent intent = new Intent(); intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE); intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.RESUME_MEDIA_PLAYER); sendBroadcast(intent); } } }; private View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { Intent intent; switch (v.getId()) { case R.id.btnChangeTrack: intent = new Intent(); intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE); intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.CHANGE_PLAYER_TRACK); intent.putExtra(MediaPlayerService.PLAYER_TRACK_URL, "http://69.64.41.64:9938"); sendBroadcast(intent); break; case R.id.btnStartMediaPlayer: startMediaPlayer("http://108.163.197.114:8071/listen.pls"); break; case R.id.btnStopMediaPlayer: intent = new Intent(); intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE); intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.STOP_MEDIA_PLAYER); sendBroadcast(intent); break; } } }; @Override protected void onResume() { super.onResume(); registerReceiver(receiverFromservice, new IntentFilter(MediaPlayerService.SERVICE_TO_ACTIVITY)); } private String currentPlayerStatus = "N/A"; private BroadcastReceiver receiverFromservice = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (MediaPlayerService.SERVICE_TO_ACTIVITY.equalsIgnoreCase(action)) { /* * To get current status of player * */ currentPlayerStatus = intent.getStringExtra(MediaPlayerService.PLAYER_STATUS_KEY); Log.e("Player Mode", "" + currentPlayerStatus); } } }; @Override protected void onPause() { super.onPause(); unregisterReceiver(receiverFromservice); } /** * TO start media player.It will send broadcast to Service & from service player will start * * @param url */ public void startMediaPlayer(String url) { Intent intent = new Intent(); intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE); intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.PLAY_MEDIA_PLAYER); intent.putExtra(MediaPlayerService.PLAYER_TRACK_URL, url); sendBroadcast(intent); } } 

MediaPlayerService

 public class MediaPlayerService extends Service { public static final String BROADCAST_TO_SERVICE = "com.mediaplayer.playerfunction"; public static final String SERVICE_TO_ACTIVITY = "com.mediaplayer.currentPlayerStatus"; public static final String PLAYER_FUNCTION_TYPE = "playerfunction"; public static final String PLAYER_TRACK_URL = "trackURL"; public static final int PLAY_MEDIA_PLAYER = 1; public static final int PAUSE_MEDIA_PLAYER = 2; public static final int RESUME_MEDIA_PLAYER = 3; public static final int STOP_MEDIA_PLAYER = 4; public static final int CHANGE_PLAYER_TRACK = 5; public static final String PLAYER_STATUS_KEY = "PlayerCurrentStatus"; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { IntentFilter intentFilter = new IntentFilter(BROADCAST_TO_SERVICE); registerReceiver(playerReceiver, intentFilter); if (mPlayer != null && mPlayer.isPlaying()) { sendPlayerStatus("playing"); } return START_STICKY; } private BroadcastReceiver playerReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BROADCAST_TO_SERVICE.equalsIgnoreCase(action)) { String trackURL = intent.hasExtra(PLAYER_TRACK_URL) ? intent.getStringExtra(PLAYER_TRACK_URL) : ""; int function = intent.getIntExtra(PLAYER_FUNCTION_TYPE, 0); switch (function) { case CHANGE_PLAYER_TRACK: changeTrack(trackURL); break; case STOP_MEDIA_PLAYER: stopPlayer(); break; case PLAY_MEDIA_PLAYER: startMediaPlayer(trackURL); break; case PAUSE_MEDIA_PLAYER: pausePlayer(); break; case RESUME_MEDIA_PLAYER: resumePlayer(); break; } } } }; private MediaPlayer mPlayer; private void pausePlayer() { if (mPlayer != null && mPlayer.isPlaying()) { mPlayer.pause(); sendPlayerStatus("pause"); } } private void resumePlayer() { if (mPlayer != null && !mPlayer.isPlaying()) { mPlayer.start(); sendPlayerStatus("playing"); } } private void changeTrack(String url) { stopPlayer(); startMediaPlayer(url); } private void stopPlayer() { if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = null; sendPlayerStatus("stopped"); } } public void startMediaPlayer(String url) { if (TextUtils.isEmpty(url)) return; if (mPlayer == null) mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(url); mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (extra == MediaPlayer.MEDIA_ERROR_SERVER_DIED || extra == MediaPlayer.MEDIA_ERROR_MALFORMED) { sendPlayerStatus("erroronplaying"); } else if (extra == MediaPlayer.MEDIA_ERROR_IO) { sendPlayerStatus("erroronplaying"); return false; } return false; } }); mPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { public void onBufferingUpdate(MediaPlayer mp, int percent) { Log.e("onBufferingUpdate", "" + percent); } }); mPlayer.prepareAsync(); mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mPlayer.start(); sendPlayerStatus("playing"); } }); mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Log.e("onCompletion", "Yes"); sendPlayerStatus("completed"); } }); mPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { return false; } }); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void sendPlayerStatus(String status) { Intent intent = new Intent(); intent.setAction(SERVICE_TO_ACTIVITY); intent.putExtra(PLAYER_STATUS_KEY, status); sendBroadcast(intent); } } 

Player.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/section_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ab_tool" android:text="Home" /> <Button android:id="@+id/btnStartMediaPlayer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/section_label" android:text="Start Player" /> <ToggleButton android:id="@+id/togglePauseResume" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btnStartMediaPlayer" android:checked="true" android:textOff="Resume" android:textOn="Pause" /> <Button android:id="@+id/btnChangeTrack" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/togglePauseResume" android:text="Chanage Track" /> <Button android:id="@+id/btnStopMediaPlayer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/btnChangeTrack" android:text="STOP" /> </RelativeLayout> 

Manifiesto

 <activity android:name=".PlayerScreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MediaPlayerService"></service> 

Para obtener datos de la transmisión de datos de encabezado de url, puede comprobar esta respuesta

Para el propósito de la prueba aquí he utilizado dos urls

ACTUALIZAR PlayerActivity

 public class PlayerScreen extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.player); startService(new Intent(this, MediaPlayerService.class)); /* * To get url which is passing from the previous activity listitem click. * If url which is pass from listitem click is not empty it will start player * */ String url = getIntent().getStringExtra("url"); if (!TextUtils.isEmpty(url)) startMediaPlayer(url); } @Override protected void onResume() { super.onResume(); registerReceiver(receiverFromservice, new IntentFilter(MediaPlayerService.SERVICE_TO_ACTIVITY)); } private String currentPlayerStatus = "N/A"; private BroadcastReceiver receiverFromservice = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (MediaPlayerService.SERVICE_TO_ACTIVITY.equalsIgnoreCase(action)) { /* * To get current status of player * */ currentPlayerStatus = intent.getStringExtra(MediaPlayerService.PLAYER_STATUS_KEY); Log.e("Player Mode", "" + currentPlayerStatus); } } }; @Override protected void onPause() { super.onPause(); unregisterReceiver(receiverFromservice); } /** * TO start media player.It will send broadcast to Service & from service player will start * * @param url */ public void startMediaPlayer(String url) { Intent intent = new Intent(); intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE); intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.PLAY_MEDIA_PLAYER); intent.putExtra(MediaPlayerService.PLAYER_TRACK_URL, url); sendBroadcast(intent); } } 

Déjame saber si algo

 MediaPlayer mp; mp=MediaPlayer.create(getApplicationContext(),Uri.parse(url)) //Example url of .pls file http://50.xx.xxx.xx:xx40/) mp.start(); mp.pause(); mp.release() (or mp.reset() as applicable) 
  • No se puede resolver el símbolo HttpEntity, HttpResponse
  • ¿Cómo enviar la solicitud SOAP y analizar la respuesta SOAP en formato XML en Android?
  • Apóstrofe no precedido por \
  • SimpleXML, org.simpleframework.xml.core.PersistenceException
  • Archivo XML válido da un error "no se pudo analizar" en Android ADT
  • Obtener elementos por nombre de etiqueta de un nodo en documento de Android (XML)?
  • Los valores de los hiladores no están ajustados correctamente
  • Problemas al analizar XML con XSL en él
  • C: ¿Cómo analizar XML en android?
  • XmlPullParser: PI no debe comenzar con xml, pero solo en Android 2.3.3 hacia abajo
  • ¿Existe una manera de enumerar las funciones XMLPullParser disponibles en el dispositivo Android actual?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.