Autor Tema: No consigo que abra el link de youtube mi app en Java  (Leído 1134 veces)

LordFer

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
No consigo que abra el link de youtube mi app en Java
« en: 03 de Enero 2024, 16:13 »
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 -->
Código: [Seleccionar]
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 -->
Código: [Seleccionar]
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 -->
Código: [Seleccionar]
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 -->
Código: [Seleccionar]
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 -->
Código: [Seleccionar]
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)-->
Código: [Seleccionar]
<?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 -->
Código: [Seleccionar]
<?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>

LordFer

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re: No consigo que abra el link de youtube mi app en Java
« Respuesta #1 en: 03 de Enero 2024, 16:14 »
Song.java
Código: [Seleccionar]
package com.example.musicreminder;

import android.os.Parcel;
import android.os.Parcelable;

public class Song implements Parcelable {
    private String name;
    private String artist;
    private String reason;
    private String youtubeLink;  // Nuevo campo
    private String listenDate;    // Nuevo campo

    public Song(String name, String artist, String reason, String youtubeLink, String listenDate) {
        this.name = name;
        this.artist = artist;
        this.reason = reason;
        this.youtubeLink = youtubeLink;
        this.listenDate = listenDate;
    }

    public String getName() {
        return name;
    }

    public String getArtist() {
        return artist;
    }

    public String getReason() {
        return reason;
    }

    public String getYoutubeLink() {
        return youtubeLink;
    }

    public String getListenDate() {
        return listenDate;
    }

    // Métodos Parcelable

    protected Song(Parcel in) {
        name = in.readString();
        artist = in.readString();
        reason = in.readString();
        youtubeLink = in.readString();
        listenDate = in.readString();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(artist);
        dest.writeString(reason);
        dest.writeString(youtubeLink);
        dest.writeString(listenDate);
    }

    public static final Creator<Song> CREATOR = new Creator<Song>() {
        @Override
        public Song createFromParcel(Parcel in) {
            return new Song(in);
        }

        @Override
        public Song[] newArray(int size) {
            return new Song[size];
        }
    };
}

ERRORES EN LOGCAT -->
Código: [Seleccionar]
2024-01-03 15:49:43.250 21063-21063 ViewRootIm...tActivity] com.example.musicreminder            I  ViewPostIme pointer 1
2024-01-03 15:49:43.260 21063-21063 AndroidRuntime          com.example.musicreminder            D  Shutting down VM
2024-01-03 15:49:43.267 21063-21063 AndroidRuntime          com.example.musicreminder            E  FATAL EXCEPTION: main
                                                                                                    Process: com.example.musicreminder, PID: 21063
                                                                                                    java.lang.IllegalStateException: Could not find method openYoutubeLink(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatImageButton with id 'btnYoutubeLink'
                                                                                                    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:506)
                                                                                                    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:464)
                                                                                                    at android.view.View.performClick(View.java:8160)
                                                                                                    at android.view.View.performClickInternal(View.java:8137)
                                                                                                    at android.view.View.access$3700(View.java:888)
                                                                                                    at android.view.View$PerformClick.run(View.java:30236)
                                                                                                    at android.os.Handler.handleCallback(Handler.java:938)
                                                                                                    at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                    at android.os.Looper.loop(Looper.java:246)
                                                                                                    at android.app.ActivityThread.main(ActivityThread.java:8653)
                                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
                                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
2024-01-03 15:49:43.334 21063-21063 Process                 com.example.musicreminder            I  Sending signal. PID: 21063 SIG: 9

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".