Hola buenas tardes, les escribo ya que creo que algunos de ustedes podrán saber que ocurre para que no funcione (he probado con una IA pero no sirve de nada). Les cuento el problema:
He creado una app que es una especie de bloc de notas de canciones. En la primera pantalla tu seleccionas si quieres poner una canción o ver tu lista de canciones. En este caso pulsamos en añadir canción, y ponemos el nombre de la canción, el autor, la fecha, porque nos gusta y el link de YouTube de la canción. Después le damos a añadir canción, aquí sale el primer error, abre directamente la canción en YT, yo no quiero que esto ocurra.
Seguidamente volvemos a la primera pantalla y le demos a ver el resto de las canciones, aqui todo perfecto porque nos sale nuestra lista de canciones que hemos añadido. Yo he añadido una opción de que cuando pulsas la foto del logo de YouTube al lado derecho de la lista, te lleve al link que has proporcionado al añadir la canción, aqui el otro problema, cuando pulsas en la imagen se cierra la app sola (adjunto fotos de como es la app)
MainActivity.java -->package com.example.musicreminder;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<Song> songList;
private static final int ADD_SONG_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Cargar la lista de canciones almacenada en las preferencias compartidas
loadSongList();
Button btnAddSong = findViewById(R.id.btnAddSong);
btnAddSong.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent addSongIntent = new Intent(MainActivity.this, AddSongActivity.class);
startActivityForResult(addSongIntent, ADD_SONG_REQUEST_CODE);
}
});
Button btnViewList = findViewById(R.id.btnViewList);
btnViewList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent viewListIntent = new Intent(MainActivity.this, SongListActivity.class);
viewListIntent.putParcelableArrayListExtra("songList", (ArrayList<Song>) songList);
startActivity(viewListIntent);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ADD_SONG_REQUEST_CODE && resultCode == RESULT_OK && data != null) {
// Recibir la nueva canción desde AddSongActivity
Song newSong = data.getParcelableExtra("newSong");
if (newSong != null) {
// Agregar la nueva canción a la lista y guardar la lista
songList.add(newSong);
saveSongList();
}
}
}
private void loadSongList() {
// Cargar la lista de canciones almacenada en las preferencias compartidas
SharedPreferences preferences = getSharedPreferences("SONG_PREFERENCES", MODE_PRIVATE);
String songListJson = preferences.getString("songList", null);
Type type = new TypeToken<List<Song>>(){}.getType();
songList = new Gson().fromJson(songListJson, type);
if (songList == null) {
// Si no hay datos, inicializa una lista vacía
songList = new ArrayList<>();
}
}
private void saveSongList() {
// Guardar la lista de canciones en las preferencias compartidas
SharedPreferences.Editor editor = getSharedPreferences("SONG_PREFERENCES", MODE_PRIVATE).edit();
editor.putString("songList", new Gson().toJson(songList));
editor.apply();
}
}
AddSongActivity -->package com.example.musicreminder;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.google.gson.Gson;
import java.util.List;
public class AddSongActivity extends AppCompatActivity {
private EditText etSongName, etArtistName, etReason, etYoutubeLink, etListenDate;
private Button btnAddToPlaylist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_song);
// Obtener referencias a las vistas
etSongName = findViewById(R.id.etSongName);
etArtistName = findViewById(R.id.etArtistName);
etReason = findViewById(R.id.etReason);
etYoutubeLink = findViewById(R.id.etYoutubeLink);
etListenDate = findViewById(R.id.etListenDate);
btnAddToPlaylist = findViewById(R.id.btnAddToPlaylist);
// Configurar el OnClickListener para el botón
btnAddToPlaylist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Obtener los valores de los campos de texto
String songName = etSongName.getText().toString();
String artistName = etArtistName.getText().toString();
String reason = etReason.getText().toString();
String youtubeLink = etYoutubeLink.getText().toString();
String listenDate = etListenDate.getText().toString();
// Comprobar si el enlace no está vacío
if (!youtubeLink.isEmpty()) {
// Crear un Intent para abrir el enlace de YouTube en la aplicación correspondiente
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(youtubeLink));
startActivity(intent);
}
// Crear un objeto Song con los valores ingresados
Song newSong = new Song(songName, artistName, reason, youtubeLink, listenDate);
// Puedes pasar la nueva canción a MainActivity
Intent intent = new Intent();
intent.putExtra("newSong", newSong);
setResult(RESULT_OK, intent);
finish();
}
});
}
// Agregar este método para el botón de YouTube
public void openYoutubeLink(View view) {
// Obtener el enlace de YouTube desde el EditText
String youtubeLink = etYoutubeLink.getText().toString();
// Log para verificar el enlace de YouTube
Log.d("YoutubeLink", "Link: " + youtubeLink);
// Comprobar si el enlace no está vacío
if (!youtubeLink.isEmpty()) {
// Crear un Intent para abrir el enlace de YouTube en la aplicación correspondiente
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(youtubeLink));
startActivity(intent);
}
}
}
SongDetailActivity --> package com.example.musicreminder;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.example.musicreminder.R;
import com.example.musicreminder.Song;
public class SongDetailActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_song_detail);
// Obtener datos de la canción del intent
if (getIntent() != null && getIntent().hasExtra("song")) {
Song song = getIntent().getParcelableExtra("song");
// Mostrar los detalles de la canción
TextView txtSongNameDetail = findViewById(R.id.txtSongNameDetail);
TextView txtArtistDetail = findViewById(R.id.txtArtistDetail);
TextView txtReasonDetail = findViewById(R.id.txtReasonDetail);
txtSongNameDetail.setText(song.getName());
txtArtistDetail.setText(song.getArtist());
txtReasonDetail.setText(song.getReason());
}
}
}
SongListActivity --> package com.example.musicreminder;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class SongListActivity extends AppCompatActivity {
private List<Song> songList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_song_list);
// Obtener la lista de canciones del intent o cargarla de preferencias compartidas
if (getIntent() != null && getIntent().hasExtra("songList")) {
songList = getIntent().getParcelableArrayListExtra("songList");
} else {
// Si no hay datos en el intent, intenta cargarlos de las preferencias compartidas
songList = loadSongList();
}
// Configurar el RecyclerView
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// Crear un adaptador para la lista de canciones
SongListAdapter adapter = new SongListAdapter(songList);
recyclerView.setAdapter(adapter);
}
private List<Song> loadSongList() {
// Cargar la lista de canciones almacenada en las preferencias compartidas
SharedPreferences preferences = getSharedPreferences("SONG_PREFERENCES", MODE_PRIVATE);
String songListJson = preferences.getString("songList", null);
Type type = new TypeToken<List<Song>>(){}.getType();
return new Gson().fromJson(songListJson, type);
}
}
SongListAdapter.java --> package com.example.musicreminder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageButton;
import androidx.recyclerview.widget.RecyclerView;
import com.example.musicreminder.R;
import com.example.musicreminder.Song;
import java.util.List;
public class SongListAdapter extends RecyclerView.Adapter<SongListAdapter.ViewHolder> {
private List<Song> songList;
public SongListAdapter(List<Song> songList) {
this.songList = songList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.song_list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Song song = songList.get(position);
holder.btnYoutubeLink.setImageResource(R.drawable.ic_youtube_thumbnail_placeholder);
holder.txtSongName.setText(song.getName());
holder.txtArtist.setText(song.getArtist());
holder.txtListenDate.setText(song.getListenDate());
holder.txtReason.setText(song.getReason());
}
@Override
public int getItemCount() {
return songList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
AppCompatImageButton btnYoutubeLink;
TextView txtSongName;
TextView txtArtist;
TextView txtListenDate;
TextView txtReason;
ViewHolder(View itemView) {
super(itemView);
btnYoutubeLink = itemView.findViewById(R.id.btnYoutubeLink);
txtSongName = itemView.findViewById(R.id.txtSongName);
txtArtist = itemView.findViewById(R.id.txtArtist);
txtListenDate = itemView.findViewById(R.id.txtListenDate);
txtReason = itemView.findViewById(R.id.txtReason);
}
}
}
song_list_item.xml (xml importante)--><?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
android:background="#84A98C"
android:backgroundTint="#84A98C"
android:orientation="horizontal"
android:padding="16dp"
tools:ignore="ExtraText">
<!-- Botón con el enlace de YouTube (izquierda) -->
<ImageButton
android:id="@+id/btnYoutubeLink"
android:layout_width="81dp"
android:layout_height="77dp"
android:src="@drawable/ic_youtube_thumbnail_placeholder"
android:background="@null"
android:scaleType="centerCrop"
android:onClick="openYoutubeLink"/>
<!-- Detalles de la canción (derecha) -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/txtArtist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:fontFamily="@font/quicksand_bold"
android:text="Nombre del autor"
android:textStyle="bold" />
<TextView
android:id="@+id/txtSongName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:fontFamily="@font/quicksand_bold"
android:text="Nombre de la canción"
android:textStyle="bold" />
<TextView
android:id="@+id/txtListenDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:fontFamily="@font/quicksand_bold"
android:text="Fecha de escucha" />
<TextView
android:id="@+id/txtReason"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:fontFamily="@font/quicksand_bold"
android:text="Por qué me gusta" />
</LinearLayout>
</LinearLayout>
AndroidManifest.xml --> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MusicReminder"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.MusicReminder">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Agrega tu actividad AddSongActivity aquí -->
<activity
android:name=".AddSongActivity"
android:label="Agregar Canción"
android:theme="@style/Theme.MusicReminder">
<!-- Agrega más configuraciones según sea necesario -->
</activity>
<activity
android:name=".SongDetailActivity"
android:label="Agregar Canción"
android:theme="@style/Theme.MusicReminder">
<!-- Agrega más configuraciones según sea necesario -->
</activity>
<activity
android:name=".SongListActivity"
android:label="Agregar Canción"
android:theme="@style/Theme.MusicReminder">
<!-- Agrega más configuraciones según sea necesario -->
</activity>
<activity
android:name=".SongListAdapter"
android:label="Agregar Canción"
android:theme="@style/Theme.MusicReminder">
<!-- Agrega más configuraciones según sea necesario -->
</activity>
<activity
android:name=".Song"
android:label="Agregar Canción"
android:theme="@style/Theme.MusicReminder">
<!-- Agrega más configuraciones según sea necesario -->
</activity>
<meta-data
android:name="preloaded_fonts"
android:resource="@array/preloaded_fonts" />
</application>
</manifest>