📱 Sketchware Video Player App - Mobile Ke Sare Videos Show Karne Wala Professional Video Gallery App (XML & Java Only)
Agar aap Sketchware ka use karke ek professional Android Video Gallery App banana chahte ho, jisme mobile ke andar maujood saare videos automatically show ho, to ye tutorial aapke liye perfect hai. Ye guide specially un users ke liye hai jo Sketchware video player app ya Sketchware video gallery app banaana chahte hain, lekin blocks ka use kiye bina.
Is complete guide me hum step-by-step dekhenge ki kaise:
- Mobile ke internal storage se saare videos fetch kare
- Unhe Grid format me gallery jaisa show kare
- Custom Video Player banaye (Play, Pause, Fullscreen)
- Android 13+ permissions properly handle kare
Sabse khaas baat: Is project me Sketchware ke ek bhi block ka use nahi hua hai. Puri app XML + Java Code se banayi gayi hai. Ye ek perfect example hai Sketchware app without blocks banane ka.
📱 Video Gallery App Features
- Automatically mobile ke sare videos load hote hain
- RecyclerView + GridLayoutManager based gallery
- Fast video thumbnail loading (ThumbnailUtils)
- Custom Video Player with SeekBar
- Fullscreen & Landscape support
- Android 13+ READ_MEDIA_VIDEO support
- No third-party library required
- 100% Java & XML (No Blocks)
📂 Project Structure (Professional Android Style)
MainActivity.java → Permission & video list PermissionHelper.java → Storage permission handling VideoFetcher.java → MediaStore se videos fetch VideoModel.java → Video data model VideoAdapter.java → RecyclerView adapter PlayerActivity.java → Custom video player main.xml → Gallery UI item_video.xml → Single video item layout player.xml → Video player UI
Ye structure perfect hai ek complete Android video player source code ke liye, jise aap Sketchware me easily implement kar sakte hain.
🔐 Step 1: New Project Create Karna (Sketchware)
Sabse pehle Sketchware open kare aur:
- App Name: Video Player
- Package Name: com.video.paly
- Create par click kare
Project create hone ke baad:
- Direct XML Editor open kare
- main.xml file me niche diya gaya code paste kare
- File save kare
📌 main.xml Code - Video Gallery Layout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/light_gray">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:background="@color/purple_500"
android:layout_height="?attr/actionBarSize"
android:elevation="4dp"
app:title="VideoGallery"
app:titleTextColor="@color/white" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:indeterminate="false"
style="?android:progressBarStyle"
android:layout_gravity="center_horizontal|center_vertical"
android:visibility="gone" />
<TextView
android:id="@+id/tvEmpty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal|center_vertical"
android:text="No videos found"
android:textSize="18sp"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:clipToPadding="false"
android:visibility="visible" />
</LinearLayout>
▶ Step 2: Video Player Screen (player.xml)
Ab Create New View par click karke ek nayi screen banaye:
- View Name: player.xml
- Toolbar: OFF
Save karne ke baad Direct XML Editor open kare aur niche diya gaya code paste kare. Ye layout Sketchware custom video player ke liye perfect hai.
📌 player.xml Code - Custom Video Player UI
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black">
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
<RelativeLayout
android:id="@+id/controlsLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:background="@color/transparent_black"
android:visibility="visible"
android:layout_alignParentBottom="true">
<ImageButton
android:id="@+id/btnPlayPause"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@android:color/transparent"
android:src="@drawable/ic_pause"
android:scaleType="center"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/tvCurrentTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:textSize="14sp"
android:layout_marginStart="16dp"
android:layout_toRightOf="@id/btnPlayPause"
android:layout_centerVertical="true" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_toRightOf="@id/tvCurrentTime"
android:layout_toLeftOf="@id/tvDuration"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/tvDuration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:textSize="14sp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
<ImageButton
android:id="@+id/btnFullscreen"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@android:color/transparent"
android:src="@drawable/ic_fullscreen"
android:scaleType="center"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/topBar"
android:layout_width="match_parent"
android:background="@color/transparent_black"
android:layout_height="?attr/actionBarSize"
android:visibility="visible">
<ImageButton
android:id="@+id/btnBack"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@android:color/transparent"
android:scaleType="center"
android:src="@android:drawable/ic_menu_close_clear_cancel"
android:tint="@color/white"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:ellipsize="end"
android:maxLines="1"
android:layout_centerInParent="true" />
</RelativeLayout>
</RelativeLayout>
🧱 Step 3: Video Item Layout (item_video.xml)
Ab Custom View create kare:
- View Name: item_video.xml
Direct XML Editor open kare aur niche diya gaya code paste kare. Ye layout video gallery app android java me RecyclerView ke items ke liye use hoga.
📌 item_video.xml Code
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp"
app:cardUseCompatPadding="true">
<RelativeLayout
android:id="@+id/relativelayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<ImageView
android:id="@+id/ivThumbnail"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="180dp"
android:background="@color/black"
android:src="@drawable/default_image"
android:scaleType="centerCrop"
android:contentDescription="Videothumbnail" />
<TextView
android:id="@+id/tvDuration"
android:focusable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:background="@color/transparent_black"
android:textSize="12sp"
android:paddingHorizontal="6dp"
android:paddingVertical="2dp"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true" />
<ImageView
android:id="@+id/imageview2"
android:focusable="false"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_play"
android:scaleType="center"
android:contentDescription="Play"
android:layout_centerInParent="true" />
<TextView
android:id="@+id/tvVideoName"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textSize="16sp"
android:textStyle="bold"
android:ellipsize="end"
android:maxLines="1"
android:layout_below="@id/ivThumbnail" />
<TextView
android:id="@+id/tvVideoInfo"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textSize="12sp"
android:layout_below="@id/tvVideoName" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
🎨 Step 4: Drawable Icons Add Karna
Resource Manager → drawable me ye files banaye:
- ic_play.xml
- ic_pause.xml
- ic_fullscreen.xml
- ic_fullscreen_exit.xml
📌 Drawable Code Examples
ic_play.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="60dp"
android:height="60dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M8,5.14v14l11,-7z"/>
</vector>
📌 Drawable Code Examples
ic_fullscreen.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="60dp"
android:height="60dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z"/>
</vector>
📌 Drawable Code Examples
ic_fullscreen_exit.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="60dp"
android:height="60dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M5,16h3v3h2v-5L5,14v2zM19,8h-3L16,5h-2v5h5L19,8zM11,19v-2h2v3h-2zM8,8L5,8v2h5L10,5L8,5v3zM16,16h3v-2h-5v5h2v-3z"/>
</vector>
📌 Drawable Code Examples
ic_pause.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="60dp"
android:height="60dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
</vector>
🎨 Step 5: Colors & Theme Setup
Resource Manager → values me ye files banaye:
- colors.xml
- themes.xml
📌 values Code
colors.xml
<resources>
<color name="colorAccent">#6E72AD</color>
<color name="colorPrimary">#6E72AD</color>
<color name="colorPrimaryDark">#6E72AD</color>
<color name="colorControlHighlight">#E0E0FF</color>
<color name="colorControlNormal">#6E72AD</color>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="gray">#808080</color>
<color name="light_gray">#F5F5F5</color>
<color name="transparent_black">#80000000</color>
<color name="accent">#2196F3</color>
</resources>📌 values Code
themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.VideoGalleryApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
</style>
</resources>
💻 Step 6: Java Files Add Karna
Java/Kotlin Manager me ye files create kare:
- MainActivity.java
- PermissionHelper.java
- PlayerActivity.java
- VideoAdapter.java
- VideoFetcher.java
- VideoModel.java
📌 Java Code - Core Files
MainActivity
package com.video.paly;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private ProgressBar progressBar;
private TextView tvEmpty;
private VideoAdapter videoAdapter;
private List<VideoModel> videoList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initializeViews();
setupRecyclerView();
// Check and request permissions
if (PermissionHelper.checkPermissions(this)) {
loadVideos();
} else {
PermissionHelper.requestPermissions(this);
}
}
private void initializeViews() {
recyclerView = findViewById(R.id.recyclerView);
progressBar = findViewById(R.id.progressBar);
tvEmpty = findViewById(R.id.tvEmpty);
// Set up toolbar
androidx.appcompat.widget.Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setTitle("Video Gallery");
}
}
private void setupRecyclerView() {
// Use GridLayoutManager for better appearance
GridLayoutManager layoutManager = new GridLayoutManager(this, 2);
recyclerView.setLayoutManager(layoutManager);
videoAdapter = new VideoAdapter(this, videoList);
recyclerView.setAdapter(videoAdapter);
}
private void loadVideos() {
showLoading(true);
// Run video fetching in background thread (No lambda)
new Thread(new Runnable() {
@Override
public void run() {
final List<VideoModel> fetchedVideos = VideoFetcher.getAllVideos(MainActivity.this);
runOnUiThread(new Runnable() {
@Override
public void run() {
videoList.clear();
videoList.addAll(fetchedVideos);
videoAdapter.notifyDataSetChanged();
showLoading(false);
// Show empty state if no videos found
if (videoList.isEmpty()) {
tvEmpty.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
} else {
tvEmpty.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
}
}
});
}
}).start();
}
private void showLoading(boolean isLoading) {
progressBar.setVisibility(isLoading ? View.VISIBLE : View.GONE);
recyclerView.setVisibility(isLoading ? View.GONE : View.VISIBLE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (PermissionHelper.handlePermissionResult(requestCode, permissions, grantResults)) {
// Permission granted, load videos
loadVideos();
} else {
// Permission denied
tvEmpty.setText("Permission denied. Please grant storage permission.");
tvEmpty.setVisibility(View.VISIBLE);
showLoading(false);
}
}
@Override
protected void onResume() {
super.onResume();
// Reload videos if permission is granted
if (PermissionHelper.checkPermissions(this)) {
loadVideos();
}
}
}PermissionHelper.java
package com.video.paly;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class PermissionHelper {
public static final int PERMISSION_REQUEST_CODE = 1001;
public static boolean checkPermissions(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// Android 13+ needs READ_MEDIA_VIDEO permission
return ContextCompat.checkSelfPermission(activity,
Manifest.permission.READ_MEDIA_VIDEO) == PackageManager.PERMISSION_GRANTED;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// Android 11-12 needs READ_EXTERNAL_STORAGE for legacy
return ContextCompat.checkSelfPermission(activity,
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
} else {
// Android 10 and below
return ContextCompat.checkSelfPermission(activity,
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}
}
public static void requestPermissions(Activity activity) {
String[] permissions;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// Android 13+
permissions = new String[]{
Manifest.permission.READ_MEDIA_VIDEO
};
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// Android 11-12
permissions = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE
};
} else {
// Android 10 and below
permissions = new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE
};
}
ActivityCompat.requestPermissions(activity, permissions, PERMISSION_REQUEST_CODE);
}
public static boolean handlePermissionResult(int requestCode, String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
return grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
}
return false;
}
}

0 Comments