Как открыть yt video, нажав на listview?
Я создаю приложение и застрял на части youtube.Мне нужно решение о том, как открыть видео на youtube, нажав на элемент listview.Я использую фрагменты и уже получил данные из Firebase.Эти данные представляют собой альбомы и треки указанных альбомов.Когда вы нажимаете на любой альбом, он открывает новое действие с треками.Теперь я хочу, чтобы, когда пользователь нажимает на любой из треков, открывалось видео этого трека. Мне нужен самый простой код, ничего слишком сложного.Я отправлю свой код.Я надеюсь, что вы, ребята и девочки, сможете мне помочь, потому что я делаю это в первый раз и мне действительно нужна помощь.Заранее спасибо.
public class TracksActivity extends FragmentActivity implements ValueEventListener { public static final String TRACKS = "Tracks"; public static final String DB_NAME = "MetalApp"; public static final String ALBUM_KEY = "SelectedAlbumKey"; public static final String LOG_TAG = "FB_database_tag"; private int targetPosition = -1; private DatabaseReference mDatabaseReference; private TrackAdapter tAdapter; @BindView(R.id.lvTracks) ListView lvTracks; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.track_fragment); ButterKnife.bind(this); } @Override public View onCreateView(String name, Context context, AttributeSet attrs) { Intent podaci = getIntent(); targetPosition = podaci.getIntExtra(ALBUM_KEY, -1); this.mDatabaseReference = FirebaseDatabase.getInstance().getReference(DB_NAME).child(TRACKS); this.mDatabaseReference.addValueEventListener(this); return super.onCreateView(name, context, attrs); } @Override public void onDataChange(DataSnapshot s) { final List<Track> tracskList = new ArrayList<>(); HashMap<String, HashMap> tracksInDatabase = (HashMap<String, HashMap>) s.getValue(); Set<String> keys = tracksInDatabase.keySet(); List<String> tempKeys = new ArrayList<>(); tempKeys.addAll(keys); Collections.sort(tempKeys, new Comparator<String>() { @Override public int compare(String s, String t1) { return s.compareToIgnoreCase(t1); } }); int currentPosition = 0; for (String albumTrack : tempKeys) { if (currentPosition == targetPosition) { HashMap<String, HashMap> trackList = tracksInDatabase.get(albumTrack); List<Track> tracks = mapTracks(trackList); Collections.sort(tracks, new Comparator<Track>() { @Override public int compare(Track track, Track t1) { return track.getId().compareTo(t1.getId()); } }); tAdapter = new TrackAdapter(tracks); this.lvTracks.setAdapter(tAdapter); } currentPosition++; } } @Override public void onCancelled(DatabaseError databaseError) { Log.e(LOG_TAG, databaseError.getMessage()); } private List<Track> mapTracks(HashMap<String, HashMap> m) { List<Track> r = new ArrayList<>(); Set<String> keys = m.keySet(); for (String key : keys) { HashMap<String, Object> album = m.get(key); String id = (String) album.get("id"); String title = (String) album.get("title"); String url = (String) album.get("url"); Track t = new Track(id, title, url); r.add(t); } return r; } @OnItemClick(R.id.lvTracks) public void onItemClick(int position){ String[] arrayList = this.getResources().getStringArray(R.array.tracks); String tr = arrayList[position]; Uri uri = Uri.parse(tr); Intent intent = new Intent(Intent.ACTION_VIEW, uri); this.startActivity(intent); } }
Метод onItemClick, вероятно, ошибочен, поэтому я бы попросил вас помочь мне в этом.
Это действие, которое должно содержать код для youtube. Кроме того, мой xml. это фрагмент.
public class YT_Activity extends AppCompatActivity { @BindView(R.id.f_Youtube) Fragment f_Yotube; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_yt_); ButterKnife.bind(this); } }
Что я уже пробовал:
Я попытался найти ответ с помощью google, но не нашел того, что искал.То же самое и на Youtube.
David Crow
"Теперь я хочу, когда пользователь нажимает на любой из треков, чтобы открыть видео этого трека."
Где находится видео?
Member 13593129
Все мои данные находятся на Firebase, включая url каждого видео.
David Crow
Итак, в ответ на вопрос: ListView
нажмите, может быть, у вас есть что-то вроде:
public static void watchYoutubeVideo(Context context, String id) { Intent appIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:" + id)); Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.youtube.com/watch?v=" + id)); try { context.startActivity(appIntent); } catch (ActivityNotFoundException ex) { context.startActivity(webIntent); } }Таким образом, он вернется к просмотру в браузере, если приложение YouTube недоступно.
Member 13593129
Итак, вы говорите, что я должен поставить этот метод вместо моего метода onItemClick? Я сделал это, и ничего не происходит.Когда я нажимаю на трек, а youtube doeesn' t открывается. Я нашел пример кода Youtube_Activity. Это выглядит так:
публичный класс Youtube_class расширяет YouTubePlayerSupportFragment {
частная статические заключительные строки currentVideoID = "идентификатор";
частный YouTubePlayer yPlayer;
@Компании bindview(Р. ИД.frame_layout) так frame_Layout;
@Ручная коррекция
public void onCreate(Bundle bundle) {
супер.метод onCreate(Bundle на);
}
@Ручная коррекция
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
Вид = насос.надуть(Р. макета.activity_yt_,контейнер, ложные);
возвращение смотреть;
}
public static Youtube_class newInstance(String url) {
Youtube_class youtube_activity = новый Youtube_class();
Bundle bundle = новый пакет();
пакет.putString("ссылка", URL-адрес);
youtube_activity.setArguments(Bundle на);
youtube_activity.инит();
вернуться youtube_activity;
}
частный недействительными инициализации() {
инициализируйте(Youtube_key.getAPI_KEY(), новый YouTubePlayer.OnInitializedListener() {
@Ручная коррекция
public void onInitializationFailure(YouTubePlayer.Поставщик arg0, YouTubeInitializationResult arg1) {
}
@Ручная коррекция
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
yPlayer = игрок;
yPlayer.setPlayerStyle(YouTubePlayer.Стиль игрока.ПО УМОЛЧАНИЮ);
если (!был восстановлен) {
yPlayer.loadVideo(getArguments().getString("url"), 0);
Youtube_class myFragment = Youtube_class.newInstance("video_id");
getFragmentManager().beginTransaction().replace(R. id.frame_layout, myFragment).commit();
}
}
});
}
/* public void onYouTubeVideoPaused() {
yPlayer.пауза();
}*/
}
David Crow
"Итак, вы говорите, что я должен поместить этот метод вместо моего метода onItemClick?"
- Конечно, нет. onItemClick()
требуется ответить на щелчок элемента. В нем вы можете вызвать функцию, которую я предложил, или взять код из нее и поместить в свой onItemClick()
непосредственно.
Member 13593129
Хорошо, я попробовал это сделать, и вот что я получаю:Error:(131, 17) error: Unable to match @OnItemClick method arguments. (com.example.lordofsummer.metalapp.Трексактивность.onItemClick)
Параметр #1: android.content.Контекст
не соответствовал никаким параметрам прослушивателя
Параметр #2: java.lang.Строка
не соответствовал никаким параметрам прослушивателя
Методы могут иметь до 4 параметров(ов):
android.виджет.AdapterView<?>
андроид.смотреть.Смотреть
int
длинный
Они могут быть перечислены в любом порядке, но поиск будет осуществляться сверху вниз.
David Crow
Поэтому измените сигнатуру метода на то, что он должен быть.
Member 13593129
Вот что я сделал:
@OnItemClick(R. id.lvTracks)
public void onItemClick(контекст context) {
Идентификатор строки;
Intent appIntent = новое намерение(намерение.ACTION_VIEW, URI-кода.синтаксический анализ("ВНД.ютуб:" + идентификатор));
Intent webIntent = новое намерение(Intent.ACTION_VIEW, URI-кода.разобрать("http://www.youtube.com/watch?v=" + ИД));
пробовать
{
context.startActivity(appIntent);
}
поймать (ActivityNotFoundException экс)
{
context.startActivity(webIntent);
}
Я инициализировал id, но id в первой строке кода говорит "не инициализирован", и единственный способ исправить это сказать так: String id = null;.
И когда я запускаю свое приложение, я получаю то же самое сообщение, что и ранее.
Я тоже пытался сделать вот так:
Контекст контекст;
@Ручная коррекция
public void onCreate(Bundle savedInstanceState) {
супер.метод onCreate(savedInstanceState);
setContentView(R. layout.track_fragment);
ButterKnife.bind(это);
lvTracks.setOnItemClickListener(новый AdapterView.OnItemClickListener() {
@Ручная коррекция
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent appIntent = новое намерение(намерение.ACTION_VIEW, URI-кода.синтаксический анализ("ВНД.ютуб:" + идентификатор));
Intent webIntent = новое намерение(Intent.ACTION_VIEW, URI-кода.разобрать("http://www.youtube.com/watch?v=" + ИД));
пробовать
{
context.startActivity(appIntent);
}
поймать (ActivityNotFoundException экс)
{
context.startActivity(webIntent);
}
}
});
И когда я нажимаю на listview, он давит, и я получаю кучу ошибок...не связанных с текущей проблемой.
David Crow
Вы должны предоставить действительный (YouTube) id. Ранее вы говорили, что URL-адрес каждого видео YouTube хранится в Firebase. Эти URL-адреса должны содержать идентификатор.