- Tel:0912084206
Dựa trên cấu trúc hai bảng bạn đã cung cấp:
videoclips_topic
: Chứa thông tin về các chủ đề video.videoclips_clip
: Chứa thông tin về các video clip, bao gồm đường dẫn tới file video.Như đã đề cập trước đó, bạn cần tạo các API PHP để lấy dữ liệu chủ đề và video dưới dạng JSON. Chi tiết API có thể tham khảo lại ở phần trước.
1.1 API PHP - Lấy danh sách chủ đề
API này sẽ trả về danh sách chủ đề (videoclips_topic
).
<?php
header('Content-Type: application/json');
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "your_database_name"; // Thay bằng tên cơ sở dữ liệu của bạn
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM nv4_vi_videoclips_topic WHERE status = 1"; // Chú ý thay nv4_vi_videoclips_topic cho đúng nhé.
$result = $conn->query($sql);
$topics = [];
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$topics[] = $row;
}
}
echo json_encode($topics);
$conn->close();
?>
API này sẽ trả về danh sách video (videoclips_clip
) theo parentid
của chủ đề.
<?php
header('Content-Type: application/json');
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "your_database_name";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$topicid = $_GET['topicid'];
$sql = "SELECT * FROM nv4_vi_videoclips_clip WHERE status = 1 AND tid = $topicid"; // nhớ thay nv4_vi_videoclips_clip cho đúng nhé
$result = $conn->query($sql);
$clips = [];
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$clips[] = $row;
}
}
echo json_encode($clips);
$conn->close();
?>
Tạo một dự án mới trong Android Studio và chọn ngôn ngữ là Kotlin.
Thêm quyền truy cập Internet vào AndroidManifest.xml
:
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/Theme.App1">
build.gradle
(module-level), thêm các thư viện sau để hỗ trợ mạng:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
Thiết kế giao diện gồm ba màn hình:
activity_main.xml
)activity_video_list.xml
)activity_video_player.xml
)activity_main.xml (Danh sách chủ đề)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/topicListView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/videoListView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
</RelativeLayout>
import android.content.Intent
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.Request
import com.android.volley.toolbox.JsonArrayRequest
import com.android.volley.toolbox.Volley
import org.json.JSONArray
import org.json.JSONException
class MainActivity : AppCompatActivity() {
private lateinit var topicListView: ListView
private val topicTitles = mutableListOf<String>()
private val topicIds = mutableListOf<Int>()
private val serverUrl = "http://yourwebsite.com/get_topics.php"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
topicListView = findViewById(R.id.topicListView)
val requestQueue = Volley.newRequestQueue(this)
val jsonArrayRequest = JsonArrayRequest(
Request.Method.GET, serverUrl, null,
{ response: JSONArray ->
for (i in 0 until response.length()) {
try {
val topic = response.getJSONObject(i)
topicTitles.add(topic.getString("title"))
topicIds.add(topic.getInt("id"))
} catch (e: JSONException) {
e.printStackTrace()
}
}
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, topicTitles)
topicListView.adapter = adapter
},
{ error ->
error.printStackTrace()
}
)
requestQueue.add(jsonArrayRequest)
topicListView.setOnItemClickListener { _, _, position, _ ->
val intent = Intent(this, VideoListActivity::class.java)
intent.putExtra("tid", topicIds[position])
startActivity(intent)
}
}
}
VideoListActivity.kt (Hiển thị danh sách video)
import android.content.Intent
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.Request
import com.android.volley.toolbox.JsonArrayRequest
import com.android.volley.toolbox.Volley
import org.json.JSONArray
import org.json.JSONException
class VideoListActivity : AppCompatActivity() {
private lateinit var videoListView: ListView
private val videoTitles = mutableListOf<String>()
private val videoPaths = mutableListOf<String>()
private var serverUrl = "http://yourwebsite.com/get_videos.php?tid="
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_list)
videoListView = findViewById(R.id.videoListView)
val tid = intent.getIntExtra("tid", 0)
serverUrl += tid
val requestQueue = Volley.newRequestQueue(this)
val jsonArrayRequest = JsonArrayRequest(
Request.Method.GET, serverUrl, null,
{ response: JSONArray ->
for (i in 0 until response.length()) {
try {
val video = response.getJSONObject(i)
videoTitles.add(video.getString("title"))
videoPaths.add("http://yourwebsite.com/" + video.getString("internalpath"))
} catch (e: JSONException) {
e.printStackTrace()
}
}
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, videoTitles)
videoListView.adapter = adapter
},
{ error ->
error.printStackTrace()
}
)
requestQueue.add(jsonArrayRequest)
videoListView.setOnItemClickListener { _, _, position, _ ->
val intent = Intent(this, VideoPlayerActivity::class.java)
intent.putExtra("videoPath", videoPaths[position])
startActivity(intent)
}
}
}
VideoPlayerActivity.kt (Phát video)
import android.net.Uri
import android.os.Bundle
import android.widget.MediaController
import android.widget.VideoView
import androidx.appcompat.app.AppCompatActivity
class VideoPlayerActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_player)
val videoView = findViewById<VideoView>(R.id.videoView)
val videoPath = intent.getStringExtra("videoPath")
videoView.setVideoURI(Uri.parse(videoPath))
videoView.setMediaController(MediaController(this))
videoView.requestFocus()
videoView.start()
}
}
VideoListActivity
để hiển thị các video trong chủ đề đó.VideoPlayerActivity
để phát video.VideoView
để phát video từ URL được truyền vào.serverUrl
trong mỗi Activity thành URL của API trên máy chủ của bạn.videoclips_clip
để đảm bảo chúng hoạt động.Ứng dụng này cơ bản và phù hợp cho TV hoặc các thiết bị Android khác có màn hình lớn.
Lập trình app tivi với module videos
Bảng dữ liệu chủ đề video
Bảng dữ liệu các video
Những tin cũ hơn