בקשת מידע | בניית חנות אפליקציות אופליין
-
אני רוצה לבנות חנות אפליקציות אופליין-שאני יזין את נתיבי קבצי הAPK והחנות תתקין אותם ע"פ בחירה
כמובן עם הרשאת רוט די שהחנות תתקין בעצמה
ביקשתי מGPT והביא לי קוד מלא אבל אני פחות יודע איך לקמפל זאת לאפליקצייה באנדרואיד סטודיו
אשמח אם מישהו יוכל לעזור
זה הקוד שהוא נתן# קוד מלא לאפליקציה להתקנת APK עם הרשאות רוט באנדרואיד (גרסאות 8-10) עם תמונות ממוזערותמבנה כללי של האפליקציה
האפליקציה תציג רשימה של אפליקציות עם תמונות ממוזערות, וכאשר לוחצים על אחת מהן, היא תתקין את קובץ ה-APK באופן עצמאי.
קובץ AndroidManifest.xml
הוסף את ההרשאות הבאות כדי לאפשר שימוש בהרשאות רוט והתקנת חבילות:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.apkinstaller"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
ממשק משתמש
קובץ
activity_main.xml
להצגת הרשימה:<?xml version="1.0" encoding="utf-8"?> <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/apkListView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
פריסה מותאמת אישית לפריט ברשימה
קובץ
list_item.xml
:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="8dp"> <ImageView android:id="@+id/appIcon" android:layout_width="48dp" android:layout_height="48dp" android:contentDescription="@string/app_icon" /> <TextView android:id="@+id/appName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:textSize="16sp" /> </LinearLayout>
קוד הפעילות הראשית (MainActivity)
קובץ
MainActivity.kt
:package com.example.apkinstaller import android.Manifest import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.graphics.drawable.Drawable import android.os.Bundle import android.widget.ListView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { data class ApkItem(val name: String, val path: String, val icon: Drawable?) private val apkFiles = listOf( ApkItem("First App", "/storage/emulated/0/Download/first_app.apk", null), ApkItem("Second App", "/storage/emulated/0/Download/second_app.apk", null), ApkItem("Third App", "/storage/emulated/0/Download/third_app.apk", null) ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // בדיקת הרשאות לקריאה וכתיבה if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE), 1) } // עדכון הרשימה עם אייקונים val apkList = apkFiles.map { val icon = getApkIcon(it.path) ApkItem(it.name, it.path, icon) } val listView: ListView = findViewById(R.id.apkListView) val adapter = ApkListAdapter(this, apkList) listView.adapter = adapter listView.setOnItemClickListener { _, _, position, _ -> val apkPath = apkList[position].path installAPK(apkPath) } } private fun getApkIcon(apkPath: String): Drawable? { val pm = packageManager return try { val info = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES) info?.applicationInfo?.let { it.sourceDir = apkPath it.publicSourceDir = apkPath pm.getApplicationIcon(it) } } catch (e: NameNotFoundException) { null } } private fun installAPK(filePath: String) { try { val process = Runtime.getRuntime().exec("su") val outputStream = process.outputStream.bufferedWriter() outputStream.write("pm install -r $filePath\n") outputStream.flush() outputStream.write("exit\n") outputStream.flush() process.waitFor() if (process.exitValue() == 0) { Toast.makeText(this, "התקנה הצליחה", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "התקנה נכשלה", Toast.LENGTH_SHORT).show() } } catch (e: Exception) { e.printStackTrace() Toast.makeText(this, "שגיאה: ${e.message}", Toast.LENGTH_LONG).show() } } }
מתאם מותאם אישית (Adapter)
קובץ
ApkListAdapter.kt
:package com.example.apkinstaller import android.content.Context import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ImageView import android.widget.TextView class ApkListAdapter(private val context: Context, private val data: List<MainActivity.ApkItem>) : BaseAdapter() { override fun getCount(): Int = data.size override fun getItem(position: Int): MainActivity.ApkItem = data[position] override fun getItemId(position: Int): Long = position.toLong() override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.list_item, parent, false) val iconView: ImageView = view.findViewById(R.id.appIcon) val nameView: TextView = view.findViewById(R.id.appName) val item = getItem(position) iconView.setImageDrawable(item.icon ?: context.getDrawable(android.R.drawable.sym_def_app_icon)) nameView.text = item.name return view } }
הערות חשובות
- הרשאות רוט:
ודא שהמכשיר שלך פרוץ (Rooted) ושיש לך גישה להרשאות רוט. - נתיבי קבצים:
ודא שקבצי ה-APK נמצאים בנתיבים הנכונים שצוינו ברשימהapkFiles
. - תמונות ממוזערות:
הקוד מושך את האייקון של האפליקציה מתוך קובץ ה-APK, במידה וזה אפשרי. - גרסאות אנדרואיד:
הקוד מותאם לגרסאות 8-10 וייתכן שידרוש התאמות לגרסאות אחרות.
אם יש לך שאלות נוספות או בעיות בהפעלת הקוד, אשמח לעזור!
- הרשאות רוט:
-
@פראירי כתב בבקשת מידע | בניית חנות אפליקציות אופליין:
אני רוצה לבנות חנות אפליקציות אופליין-שאני יזין את נתיבי קבצי הAPK והחנות תתקין אותם ע"פ בחירה
כמובן עם הרשאת רוט די שהחנות תתקין בעצמה
ביקשתי מGPT והביא לי קוד מלא אבל אני פחות יודע איך לקמפל זאת לאפליקצייה באנדרואיד סטודיו
אשמח אם מישהו יוכל לעזור
זה הקוד שהוא נתן# קוד מלא לאפליקציה להתקנת APK עם הרשאות רוט באנדרואיד (גרסאות 8-10) עם תמונות ממוזערותמבנה כללי של האפליקציה
האפליקציה תציג רשימה של אפליקציות עם תמונות ממוזערות, וכאשר לוחצים על אחת מהן, היא תתקין את קובץ ה-APK באופן עצמאי.
קובץ AndroidManifest.xml
הוסף את ההרשאות הבאות כדי לאפשר שימוש בהרשאות רוט והתקנת חבילות:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.apkinstaller"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
ממשק משתמש
קובץ
activity_main.xml
להצגת הרשימה:<?xml version="1.0" encoding="utf-8"?> <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/apkListView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
פריסה מותאמת אישית לפריט ברשימה
קובץ
list_item.xml
:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="8dp"> <ImageView android:id="@+id/appIcon" android:layout_width="48dp" android:layout_height="48dp" android:contentDescription="@string/app_icon" /> <TextView android:id="@+id/appName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:textSize="16sp" /> </LinearLayout>
קוד הפעילות הראשית (MainActivity)
קובץ
MainActivity.kt
:package com.example.apkinstaller import android.Manifest import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.graphics.drawable.Drawable import android.os.Bundle import android.widget.ListView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { data class ApkItem(val name: String, val path: String, val icon: Drawable?) private val apkFiles = listOf( ApkItem("First App", "/storage/emulated/0/Download/first_app.apk", null), ApkItem("Second App", "/storage/emulated/0/Download/second_app.apk", null), ApkItem("Third App", "/storage/emulated/0/Download/third_app.apk", null) ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // בדיקת הרשאות לקריאה וכתיבה if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE), 1) } // עדכון הרשימה עם אייקונים val apkList = apkFiles.map { val icon = getApkIcon(it.path) ApkItem(it.name, it.path, icon) } val listView: ListView = findViewById(R.id.apkListView) val adapter = ApkListAdapter(this, apkList) listView.adapter = adapter listView.setOnItemClickListener { _, _, position, _ -> val apkPath = apkList[position].path installAPK(apkPath) } } private fun getApkIcon(apkPath: String): Drawable? { val pm = packageManager return try { val info = pm.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES) info?.applicationInfo?.let { it.sourceDir = apkPath it.publicSourceDir = apkPath pm.getApplicationIcon(it) } } catch (e: NameNotFoundException) { null } } private fun installAPK(filePath: String) { try { val process = Runtime.getRuntime().exec("su") val outputStream = process.outputStream.bufferedWriter() outputStream.write("pm install -r $filePath\n") outputStream.flush() outputStream.write("exit\n") outputStream.flush() process.waitFor() if (process.exitValue() == 0) { Toast.makeText(this, "התקנה הצליחה", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "התקנה נכשלה", Toast.LENGTH_SHORT).show() } } catch (e: Exception) { e.printStackTrace() Toast.makeText(this, "שגיאה: ${e.message}", Toast.LENGTH_LONG).show() } } }
מתאם מותאם אישית (Adapter)
קובץ
ApkListAdapter.kt
:package com.example.apkinstaller import android.content.Context import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ImageView import android.widget.TextView class ApkListAdapter(private val context: Context, private val data: List<MainActivity.ApkItem>) : BaseAdapter() { override fun getCount(): Int = data.size override fun getItem(position: Int): MainActivity.ApkItem = data[position] override fun getItemId(position: Int): Long = position.toLong() override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.list_item, parent, false) val iconView: ImageView = view.findViewById(R.id.appIcon) val nameView: TextView = view.findViewById(R.id.appName) val item = getItem(position) iconView.setImageDrawable(item.icon ?: context.getDrawable(android.R.drawable.sym_def_app_icon)) nameView.text = item.name return view } }
הערות חשובות
- הרשאות רוט:
ודא שהמכשיר שלך פרוץ (Rooted) ושיש לך גישה להרשאות רוט. - נתיבי קבצים:
ודא שקבצי ה-APK נמצאים בנתיבים הנכונים שצוינו ברשימהapkFiles
. - תמונות ממוזערות:
הקוד מושך את האייקון של האפליקציה מתוך קובץ ה-APK, במידה וזה אפשרי. - גרסאות אנדרואיד:
הקוד מותאם לגרסאות 8-10 וייתכן שידרוש התאמות לגרסאות אחרות.
אם יש לך שאלות נוספות או בעיות בהפעלת הקוד, אשמח לעזור!
אל תבנה על קוד מלא ש-GPT נתן לך, בדרך כלל צריך עשרות אם לא מאות תיקונים. אני כן מאמין ביכולות שלו, אבל לא עד כדי בניית אפליקציות מורכבות לבד. גם אין כמעט עיצוב...
בכל אופן אם זה דחוף לך אני יכול לבנות לך משהו בסיסי. - הרשאות רוט:
-
@פראירי כתב בבקשת מידע | בניית חנות אפליקציות אופליין:
@א-מ-ד כתב בבקשת מידע | בניית חנות אפליקציות אופליין:
בכל אופן אם זה דחוף לך אני יכול לבנות לך משהו בסיסי.
אשמח ביותר!
תפרט מה אתה רוצה בדיוק.
-
@א-מ-ד כתב בבקשת מידע | בניית חנות אפליקציות אופליין:
@פראירי כתב בבקשת מידע | בניית חנות אפליקציות אופליין:
@א-מ-ד כתב בבקשת מידע | בניית חנות אפליקציות אופליין:
בכל אופן אם זה דחוף לך אני יכול לבנות לך משהו בסיסי.
אשמח ביותר!
תפרט מה אתה רוצה בדיוק.
ליצור אפליקציה שיהיה לה מתקין חבילות עצמאי עם רוט ולא באמצעות מתקין החבילה
והאפליקציה יהיה לה תקייה בAPP או בDATA עם קבצי APK והאפליקציה תציג סמליל של התוכנות ויהיה אפשרות בבחירה על אחת התוכנות להתקין אותה
זה הכל בגדול..