loading...

مقالات طراحی اپ موبایل

بازدید : 13
پنجشنبه 12 تير 1404 زمان : 11:36


ایراد عدم فراخوانی onMessageReceived
این اختلال به نحوه رئیس نوتیفیکیشن‌ها مربوط می‌گردد و به payload نوتیفیکیشن نیز رابطه داراست. تابع onMessageReceived به طور پیش‌فرض فقط وقتی فراخوانی می‌گردد که نرم افزار در پیش‌مسئله میباشد. این بدان مضمون‌ میباشد که هنگامی نرم افزار در پس‌قضیه میباشد و یا این که کلاً گشوده نشده میباشد، سیستم نوتیفیکیشن طراحی اپلیکیشن در مشهد را برای ما رئیس می‌نماید.


کلیک نمایید
در حالتی‌که می خواهید نوتیفیکیشن را در هر دو موقعیت مدیر فرمائید، دو مورد وجود دارااست. یکی‌از این که بعداز کلیک کردن روی نوتیفیکیشن ایفا دهید و دیگری آن که آن را مستقیماً وقتی که وارد می شود مدیر نمایید. به دنبال به رسیدگی payload نوتیفیکیشن می پردازیم:

1{
2 "message":{
3 "token":"...",
4 "notification":{
5 "title":"This is your notification\'s title",
6 "body":"This is the body text of your notification"
7 },
8 "data" : {
9 "first_name" : "Android",
10 "last_name" : "Roboto"
11 }
12 }
13}

هرزمان که یک title و یک body در نوتیفیکیشن وجود داشته باشد، سیستم آن را در پس‌مورد مدیر می‌نماید. وقتی که data در payload باشد و روی نوتیفیکیشن کلیک فرمایید میتوانید آن را در خدمت خودتان مدیر فرمایید.

در حالتی که در نوتیفیکیشن خویش title و body ندارید، نوتیفیکیشن ورودی همواره به خدمت میرسد. این بدان مضمون‌ میباشد که شما بایستی نوتیفیکیشن را خودتان بسازید تا بتوانید آن را اکران دهید.

شبکه‌های نوتیفیکیشن چه می باشند؟
از اندروید O (سطح API 26) به آنگاه قابلیت به کارگیری از شبکه‌های نوتیفیکیشن وجود دارااست. چنانچه هیچ چیزی تعریف‌و‌تمجید نشده باشد، تمامی نوتیفیکیشن‌ها در شبکه پیش‌فرض ارسال می گردند. با این درحال حاضر می‌قدرت با اضافه کردن قطعه کد پایین به مانیفست یک شبکه پیش‌فرض مخصوص نیز تمجید کرد:

1 2 android:name="com.google.firebase.messaging.default_notification_channel_id"
3 android:value="@string/my_default_notification_channel" />

درصورتی که نوتیفیکیشن‌ها مشتمل بر شناسه شبکه نباشند، درین شبکه پیش‌فرض سفارشی قرار می گیرند.

همینطور قادر خواهیم بود یک قدم بالاتر گذاشته و استارت به تمجید شبکه‌های خاص خودمان بکنیم. این کاری میباشد که در کلاس Application تحت ایفا داده‌ایم:

1class MyApp : Application() {
2 override fun onCreate() {
3 super.onCreate()
4
5 // Create notification channels
6 initNotificationChannels()
7
8 // ... Do other stuff
9 }
10
11 private fun initNotificationChannels() {
12 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
13 // Build your channel
14 val myChannel = NotificationChannel(
15 MessagingService.MY_CHANNEL_ID,
16 getString(R.string.my_channel_title), // The channel title in the app settings
17 NotificationManager.IMPORTANCE_DEFAULT)
18 .apply {
19 // The description of the channel in the app settings
20 description = getString(R.string.channel_podcasts_description)
21 }
22
23 // Register the channel with the system
24 val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
25 notificationManager.createNotificationChannel(myChannel)
26 }
27 }
28}
مشاهده بدون نقص کدها
به همین آسانی میباشد. فعلا میتوانید نوتیفیکیشن‌ها را از روش payload نوتیفیکیشن و یا این که از روش MessagingService به شبکه خاص خویش تحویل دهید.

حرف نهایی

امید واریم از تحقیق این نوشته ی علمی سود مایحتاج را برده باشید و با طرز مدیر نوتیفیکیشن در نرم افزار‌ها آشنا گردیده باشید.

ویژگی های نهفته tools در اندروید استودیو – راهنمای کاربردی
احتمالاً بیشتر شما خوانند‌گان مه این مقاله را برای بازرسی گزینش کرده‌اید با ویژگی‌های خیره کننده XML با پیشوند :tools در طول پیاده سازی لی‌آوت نرم افزار در اندروید استودیو شغل کرده‌اید. اکثر وقت ها ما از ویژگی tools:text به صورت مکرر در مواقعی که متن می بایست به طور دینامیک در طی ایفا اضافه خواهد شد و از این رو استعمال از ویژگی android:text میسر وجود ندارد به کار گیری می کنیم. در‌این راهنما میخواهیم مبادرت به شناخت با مختصات نهفته tools:‎ در اندروید استودیو بکنیم.
با این اکنون ارتباط اکثر اوقات ما با این ابزار قوی بالاتر از ویژگی‌های tools:text, tools:visibility و tools:context نمی‌رود. البته بخش اعظمی از شرایط‌ها وجود دارا‌هستند که احاطه داشتن روی این ابزار موجب می‌گردد اشتباهات حل شوند و از مجدد‌کاری‌های متعددی پرهیز گردد. به این ترتیب درین نوشته ی علمی در زمینه‌ی ویژگی‌های tools کلام می کنیم. به دنبال همت می کنیم فهم و شعور بهتری از شیوه عمل این ویژگی‌ها و کمکی که می توانند به ما در اپ‌نویسی اندروید بکنند به دست آوریم.

مرور کلی
پیش از هر چیز و قبل از آن که وارد ریزه کاری tools بشویم، بایستی یک مرور کلی روی ویژگی‌های tools داشته باشیم و روش استعمال از آنها‌را توضیح دهیم.


کلیک نمائید
به ذکر کلی ویژگی‌های tools، در واقع مختصات XML خاصی میباشند که خیر صرفا خصوصیت‌های مجال پیاده سازی (مانند این که کدام لی‌آوت می بایست باطن فرگمان ترسیم گردد) را در مشت ما قرار میدهند، بلکه رفتارهای فرصت کامپایل مانند سرکوب هشدارهای lint را نیز در دست گرفتن می‌نمایند.

مطابق راهنمای کاربری قانونی، این مختصات صرفا از سوی اندروید استودیو مصرف شده و در طی build نرم افزار از سوی build tools حذف میشوند. براین اساس استعمال از این ویژگی‌ها تأثیری روی اندازه APK و خلق مجال انجام ندارد.

برای به کار گیری از این ویژگی‌ها فضای اسم tools می بایست به عنصر ریشه فولدر xml چنان که در تحت اکران یافته اضافه گردد:

1 2xmlns:tools=”http://schemas.android.com/tools" >

مطابق تابعی که ویژگی ایفا می‌نماید، می توانیم ویژگی‌های tools را به سه گروه تقسیم کنیم

بازدید : 15
چهارشنبه 11 تير 1404 زمان : 13:11


تولید و یکدست سازی چت بات اندرویدی با Dialogflow – راهنمای مقدماتی
Dialogflow از خدمت‌های گوگل میباشد که پیش از اینً به اسم API.ai شناخته میشد و پلتفرمی بهتر برای توسعه و گسترش چت‌بات‌ها برای پلتفرم‌های متعدد میباشد. راهنماها و مستندات متعددی برای کسانی که جدیدا استارت به یادگیری و به کارگیری از این پلتفرم برای ایجاد کرد چت‌بات نموده‌اند وجود دارا هستند. با این وجود، مدد از اندروید و iOS به خیر و خوبی مستندسازی نشده میباشد.
تا تا قبل از این که Dialogflow به اسم API.ai نامیده می شد، کتابخانه کلاینت اندروید و iOS برای مخلوط چت‌بات در نرم افزار‌های گوشی ارائه گردیده بود؛ البته بعد از ترکیب آن در گوگل، کتابخانه جانور دیگر به‌روزرسانی نشد و شاهد اضافه شدن Dialogflow به پلتفرم کلاود گوگل بودیم که API کلاینت جدیدی مطابق جاوا طراحی اپلیکیشن در مشهد در حالا بسط میباشد.

درین نوشته ی علمی، طرز یک دست‌سازی چت‌بات بسط‌یافته در Dialogflow با به کار گیری از کتابخانه API.ai دیرین و API کلاینت جاوای نو را توضیح میدهیم. براین اساس برای اکران این مسئله یک چت‌بات معمولی ساخت و ساز می کنیم که اطلاعاتی در ارتباط زمان‌های متفاوت جشنواره پیشرفت‌دهندگان دهلی‌تازه که از سوی GDG برگزار میگردد ارائه می‌نماید.


کلیک نمائید
آغاز می بایست اسکریپتی بنویسیم که استفاده کننده بتواند با چت‌بات مکالمه نماید.

User: I want the list of sessions at Dev Fest in New Delhi.

Bot: Sure! There will be 4 tracks of sessions. For which track do you want the information?

User: third track.

Bot: 9:00–9:30 Registrations… Anything else?

User: No.

Bot: Thank you! Have a great day :)
آن گاه یک Agent برای Dialogflow میسازیم که Test_agent اسم دارااست.


اکانت خدمت برای ساخت داده ها احراز نام‌و‌نشان برای API کلاینت جاوا به کار گیری می شود.

توکن دسترسی کلاینت برای یک پارچه‌سازی کتابخانه کلاینت اندروید
برای API کلاینت جاوا بایستی روی اکانت خدمت کلیک کرده و کلید JSON ساخت و ساز گردیده از سوی کنسول IAM را به دست آوریم.

اکنون اینتِنت (Intent) ها و نهادهایی را برای یادگرفتن دادن ایجنت ساخت میکنیم.


get_agenda مبادرت به رئیس درخواست‌ها و واکشی عصر‌هایی که اطلاعاتشان ما یحتاج میباشد می‌نماید.

اضافه کردن مترادف و هم معنی‌ها برای به چنگ آوردن مقادیر زمان‌ها

پارامتری برای واکشی زمان‌ها و فعال سازی ترکیب اینترنت‌هوک تاسیس شده است.
یک تابع کلاود برای رئیس درخواست اینترنت‌هوک ساخت و ساز میکنیم. مطابق شماره عصر تشخیص داده گردیده، جواب قابل قبولی به مخاطب ارسال میگردد.

فعلا ایجنت ما فراهم ترکیب با نرم افزار اندروید میباشد.


کلیک نمائید
در build.gradle (در سطح app) تعلق‌هایی برای کتابخانه کلاینت اندروید و API کلاینت جاوا اضافه می کنیم زیرا این چت‌بات را برای هر دو آیتم بسط میدهیم.

dependencies {
implementation fileTree(dir: \'libs\', include: [\'*.jar\'])
implementation \'com.android.support:appcompat-v7:28.0.0\'
testImplementation \'junit:junit:4.12\'
androidTestImplementation \'com.android.support.test:runner:1.0.2\'
androidTestImplementation \'com.android.support.test.espresso:espresso-core:3.0.2\'

// Dialogflow SDK dependencies
implementation \'ai.api:sdk:2.0.7@aar\'
implementation \'ai.api:libai:1.6.12\'

// Java V2
implementation \'com.google.cloud:google-cloud-dialogflow:0.67.0-alpha\'
// for Remote Procedure Call to avoid "No functional channel service provider found" error while creating SessionsClient
implementation \'io.grpc:grpc-okhttp:1.15.1\'
}
این چت‌بات در سیاق onCreate اکتیویتی اندروید شروع می گردد. آغاز به تنظیمات ایجنت Dialogflow با استعمال از توکن دسترسی کلاینت با یا این که به کار گیری از کلید JSON میکنیم. آن‌گاه یک گردهمایی (session) نو با به کار گیری از ID یکتا ساخت و ساز میکنیم و در غایت بات فراهم تعامل با استفاده کننده خواهد بود.

کتابخانه کلاینت اندروید
private void initChatbot() {
final AIConfiguration config = new AIConfiguration(BuildConfig.ClientAccessToken,
AIConfiguration.SupportedLanguages.English,
AIConfiguration.RecognitionEngine.System);
aiDataService = new AIDataService(this, config);
customAIServiceContext = AIServiceContextBuilder.buildFromSessionId(uuid);// helps to create new session whenever app restarts
aiRequest = new AIRequest();
}
API کلاینت جاوا
private void initV2Chatbot() {
try {
InputStream stream = getResources().openRawResource(R.raw.test_agent_credentials);
GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
String projectId = ((ServiceAccountCredentials)credentials).getProjectId();

SessionsSettings.Builder settingsBuilder = SessionsSettings.newBuilder();
SessionsSettings sessionsSettings = settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
sessionsClient = SessionsClient.create(sessionsSettings);
session = SessionName.of(projectId, uuid);
} catch (Exception e) {
e.printStackTrace();
}
}
ما رابطه چت‌بات با استفاده کننده را به طریق ناهمگام (Asynchronous) رئیس می کنیم. این شغل در مشی AsyncTask شکل میگیرد که در آن کوئری درخواستی از مخاطب به طور یک درخواست به چت‌بات ارسال گردیده و جواب اخذ می گردد.

مدیر AsyncTask در فراخوانی‌های کتابخانه کلاینت اندروید
public class RequestTask extends AsyncTask {

Activity activity;
private AIDataService aiDataService;
private AIServiceContext customAIServiceContext;

RequestTask(Activity activity, AIDataService aiDataService, AIServiceContext customAIServiceContext){
this.activity = activity;
this.aiDataService = aiDataService;
this.customAIServiceContext = customAIServiceContext;
}

@Override
protected AIResponse doInBackground(AIRequest... aiRequests) {
final AIRequest request = aiRequests[0];
try {
return aiDataService.request(request, customAIServiceContext);
} catch (AIServiceException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(AIResponse aiResponse) {
((MainActivity)activity).callback(aiResponse);
}
}
رئیس AsyncTask برای فراخوانی‌های API کلاینت جاوا
public class RequestJavaV2Task extends AsyncTask {

Activity activity;
private SessionName session;
private SessionsClient sessionsClient;
private QueryInput queryInput;

RequestJavaV2Task(Activity activity, SessionName session, SessionsClient sessionsClient, QueryInput queryInput) {
this.activity = activity;
this.session = session;
this.sessionsClient = sessionsClient;
this.queryInput = queryInput;
}

@Override
protected DetectIntentResponse doInBackground(Void... voids) {
try{
DetectIntentRequest detectIntentRequest =
DetectIntentRequest.newBuilder()
.setSession(session.toString())
.setQueryInput(queryInput)
.build();
return sessionsClient.detectIntent(detectIntentRequest);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(DetectIntentResponse response) {
((MainActivity) activity).callbackV2(response);
}
}
استفاده کننده قادر است کوئری را از نرم افزار اندروید با به کارگیری از EditText ارسال نماید و جواب در یک TextView اکران مییابد.

درخواست و جواب که در کتابخانه کلاینت اندروید رئیس می گردند
private void sendMessage(View view) {
String msg = queryEditText.getText().toString();
if (msg.trim().isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
} else {
showTextView(msg, USER);
queryEditText.setText("");
// Android client
aiRequest.setQuery(msg);
RequestTask requestTask = new RequestTask(MainActivity.this, aiDataService, customAIServiceContext);
requestTask.execute(aiRequest);
}
}

public void callback(AIResponse aiResponse) {
if (aiResponse != null) {
// process aiResponse here
String botReply = aiResponse.getResult().getFulfillment().getSpeech();
Log.d(TAG, "Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
رئیس درخواست و جواب در API کلاینت جاوا
private void sendMessage(View view) {
String msg = queryEditText.getText().toString();
if (msg.trim().isEmpty()) {
Toast.makeText(MainActivity.this, "Please enter your query!", Toast.LENGTH_LONG).show();
} else {
showTextView(msg, USER);
queryEditText.setText("");
// Android client
// aiRequest.setQuery(msg);
// RequestTask requestTask = new RequestTask(MainActivity.this, aiDataService, customAIServiceContext);
// requestTask.execute(aiRequest);

// Java V2
QueryInput queryInput = QueryInput.newBuilder().setText(TextInput.newBuilder().setText(msg).setLanguageCode("en-US")).build();
new RequestJavaV2Task(MainActivity.this, session, sessionsClient, queryInput).execute();
}
}

public void callback(AIResponse aiResponse) {
if (aiResponse != null) {
// process aiResponse here
String botReply = aiResponse.getResult().getFulfillment().getSpeech();
Log.d(TAG, "Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}

public void callbackV2(DetectIntentResponse response) {
if (response != null) {
// process aiResponse here
String botReply = response.getQueryResult().getFulfillmentText();
Log.d(TAG, "V2 Bot Reply: " + botReply);
showTextView(botReply, BOT);
} else {
Log.d(TAG, "Bot Reply: Null");
showTextView("There was some communication issue. Please Try again!", BOT);
}
}
ااینک مخلوط چت‌بات ما نقطه نهایی یافته میباشد. بعداز اضافه کردن تغییرات ما یحتاج در UI برای به دست آوردن کوئری مخاطب و اکران جواب بات، میتوانید مثال چت‌بات پایانی را در ویدئوی ذیل ملاحظه کنید.

بازدید : 16
سه شنبه 10 تير 1404 زمان : 17:46


چرا می بایست اندروید Q را تارگت کنیم؟
اندروید 10 یا این که اندروید Q رسما در تاریخ 3 سپتامبر 2019 (12 شهریور 1398) منتشر شد‌ه‌است و ورژن بعداز اندروید 9 و طراحی اپلیکیشن در مشهد جدیدترین ورژن اندروید به حساب میآید که از سنت نامگذاری بر پایه ی اسم شیرینی‌ها تقلید نمی‌نماید.

کلیک فرمایید
اکثر زمان ها پیشنهاد میشود که هر یک‌سری برای آزمایش واپسین ورژن اندروید را تارگت کنیم و گوگل پلی استور نیز درین خصوص پیشنهادهایی به تفصیل ذیل داراست:

همان گونه که میبینید هر سال الزام گوگلی پلی به ورژن تازه افزایش می یابد. این بدان مضمون‌ میباشد که از تاریخ 1 آگوست 2020 (11 مرداد 1399) نرم افزار‌های تازه می بایست API سطح 29 را تارگت نمایند. به این ترتیب مجال متعددی برای آزمایش این که تمامی چیز روی ورژن تازه به صحت فعالیت می‌نماید ندارید.

پیش از هر چیز می بایست ورژن نو را تارگت کنیم تا ببینیم چه اتفاقاتی فیس میدهند. به‌این مراد کافی میباشد پاراگراف targetSdkVersion را در تنظیمات پیدا فرمایید و آن را روی 29 تهیه و تنظیم نمائید. آن گاه پروژه را کامپایل نمایید و هشدارها و خطاهای کامپایل را پژوهش فرمائید.

درپی مثال‌ای از هشدارهایی را که ممکن میباشد بگیرید ارائه کرده‌ایم. این هشدارها از پروژه حقیقی که سطح 28 به 29 افزایش یافته ناشی گردیده‌اند:

Type mismatch: inferred type is MenuItem? but MenuItem was expected
Type mismatch: inferred type is Configuration? but Configuration was expected
Type mismatch: inferred type is String? but String was expected
\'setColorFilter(Int, PorterDuff.Mode): Unit\' is deprecated. Deprecated in Java
Type mismatch: inferred type is Date? but Date was expected
Unsafe use of a nullable receiver of type Any?
\'PreferenceManager\' is deprecated. Deprecated in Java
\'NetworkInfo\' is deprecated. Deprecated in Java
\'getter for activeNetworkInfo: NetworkInfo!\' is deprecated. Deprecated in Java
\'getter for isConnectedOrConnecting: Boolean\' is deprecated. Deprecated in Java
در لیست فوق به جز پژوهش‌های null و اضافه شدن پکیج androidx.preference چیز متعددی نیست. تمامی این مورد ها در طول 20 دقیقه تماماً رفع می شوند. البته به‌دنبال با نقص‌ منسوخ شدن NetworkInfo مواجه می‌شویم.

NetworkInfo در سطح 29 منسوخ گردیده‌است:

فراخوانی‌کننده‌ها به مکان ConnectivityManager.NetworkCallback می بایست با تغییراتی که در مسئله اتصال‌پذیری واقع گردیده آشنا شوند و از ConnectivityManager#getNetworkCapabilities یا این که ConnectivityManager#getLinkProperties برای اخذ ناهمگام داده ها به کار گیری نمایند.

یک نحوه برای حل این ایراد این میباشد که به موعظه‌های ارتقای قانونی (+) روی اینترنت‌وبسایت اندروید نگاه کنیم. متأسفانه درین اینترنت‌وبسایت داده ها متعددی ارائه نشده میباشد و از این رو می بایست از توان ماهیچه‌های ذهن برای حل این خلل امداد بگیریم. تا قبل از این خبرهاِ بد در خصوص شرایط اتصال‌پذیری صرفا کاری که بایستی اجرا می‌دادیم به طور پایین بود:

1class NetworkUtils(private val context: Context) {
2 fun isConnected(): Boolean {
3 val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
4 val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
5 var result = false
6 if (activeNetwork != null) {
7 result = activeNetwork.isConnectedOrConnecting
8 }
9 return result
10 }
11}

این کد می بایست از هر جایی با فرض دسترسی به Context نرم افزار فراخوانی میشود و به راحتی می شد پژوهش کرد که آیا دستگاه اینک به کانال دسترسی داراست یا این که خیر. برای اخذ تغییرات در اتصال دستگاه به کانال نیز بایستی به طور پایین کار می شد:

پوشه BaseActivity.kt
1abstract class BaseActivity : AppCompatActivity() {
2 private var networkCallback: ConnectivityManager.NetworkCallback? = null
3 private val networkUtils by lazy { NetworkUtils(applicationContext) /*important to be applicationContext to prevent memoryLeak*/}
4 private val connectivityManager by lazy { getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager }
5
6 protected val NetworkStateReceiverListener.isConnected: Boolean // can be used by childs
7 get() {
8 this as BaseActivity // only accessible from child class, so cast i safe here
9 return networkUtils.isConnected()
10 }
11
12 private fun registerConnectivityMonitoring(listener: NetworkStateReceiverListener) {
13 val networkCallback = object : ConnectivityManager.NetworkCallback() {
14 override fun onAvailable(network: Network?) {
15 listener.networkConnectivityChanged()
16 }
17
18 override fun onLost(network: Network?) {
19 listener.networkConnectivityChanged()
20 }
21 }
22 this.networkCallback = networkCallback
23 connectivityManager.registerNetworkCallback(NetworkRequest.Builder().build(), networkCallback)
24 }
25
26 private fun unregisterConnectivityMonitoring() {
27 val networkCallback = this.networkCallback ?: return
28 connectivityManager.unregisterNetworkCallback(networkCallback)
29 this.networkCallback = null
30 }
31
32 override fun onCreate(savedInstanceState: Bundle?) {
33 super.onCreate(savedInstanceState)
34 if (this is NetworkStateReceiverListener)
35 registerConnectivityMonitoring(this)
36 }
37
38 override fun onDestroy() {
39 super.onDestroy()
40 if (this is NetworkStateReceiverListener)
41 unregisterConnectivityMonitoring()
42 }
43
44 override fun onResume() {
45 super.onResume()
46 if (this is NetworkStateReceiverListener && !isConnected)
47 this.networkConnectivityChanged()// call to show no network banner on activity resume
48 }
49}
مشاهده بی نقص کدها
پوشه MyActivity.kt
1class MainActivity : BaseActivity(), NetworkStateReceiverListener {
2 override fun networkConnectivityChanged() {
3 if (isConnected) {
4 //show that that the network is back
5 } else {
6 //show that that the network was lost
7 }
8 }
9}

پوشه NetworkStateReceiverListener.kt
1interface NetworkStateReceiverListener {
2 fun networkConnectivityChanged() {}
3}

در حال حاضر که ConnectivityManager#getActiveNetworkInfo را از دست داده‌ایم صرفا نحوه برای پژوهش ناهمگام اتصال دستگاه به کانال به کارگیری از API تحت میباشد:

کلیک نمائید
NetworkCallback – این API میباشد که از گذشته می شناسیم و شاید حتی استعمال کرده‌ایم. این یک اینترفیس برای پیاده‌سازی اخذ رویدادهای اتصال‌پذیری دستگاه میباشد.
ConnectivityManager#getNetworkCapabilities – با دقت به کانال، گنجایش‌هایی مانند نوع کانال (گوشی یا این که WIFI) پهنای باند و غیره را می گیرد.
ConnectivityManager#getLinkProperties – با دقت به کانال مشخصه‌های پیوند کانال مانند اینترفیس کانال را عرضه می‌نماید.
در لیست فوق مفاد 2 و 3 از API سطح 21 وجود داشته‌اند، ولی تا به امروز زیاد با آن ها عمل نکرده‌ایم و به لحاظ میرسد که فیض‌ای شبیه کد قبل به دست نمی‌دهد.

هر دو آن ها به یک آرگومان Network نیاز دارا هستند که با ConnectivityManager#getActiveNetwork به دست میاید، البته در غایت هیچ کدام هم اندازه NetworkInfo#isConnected یا این که NetworkInfo#isConnectedOrConencting نیستند.

راه حل عمل این میباشد که موقعیت اتصال را جایی در اندروید ذخیره کنیم. بدین مراد می بایست بعضی مورد ها را در پیاده‌سازی NetworkCallback گزینه بازنگری در اختیار بگذاریم.

بازدید : 16
دوشنبه 9 تير 1404 زمان : 16:09


قدم سوم – نیازمندهای فنی
برای تکثیر برنامه در گوگل پلی نیاز میباشد تا چند از نیازمندهای فنی موردنیاز گوگل را قبل از پروسه تکثیر فراهم فرمایید. نیازمندی های فنی گوگل طراحی اپلیکیشن در مشهد برای تکثیر نرم افزار در گوگل پلی به طور ذیل میباشد:

Bundle ID: اسم پکیج نرم افزار می بایست به طوری گزینش خواهد شد که در دراز زمان نیز نیازی به تغییر تحول آن نباشد. قابلیت و امکان تغییر تحول این نصیب نرم افزار بعد از نشر نیست.
ورژن امضا گردیده نرم افزار (Signed App Release): کلیه نرم افزار های برای منتشر شدن در گوگل پلی بایستی یک سند دیجیتال (Certification) داشته باشند. به امداد این سند می قدرت خالق نرم افزار را شناسایی کرد و قابلیت و امکان تغییر و تحول و دستکاری آن بعداز نشر نیز نیست.
سایز نرم افزار: گوگل حداکثر سایز نرم افزار را برای نشر در گوگل پلی، 100 مگابایت در حیث گرفته میباشد. بدین ترتیب نیاز میباشد تا از سایز نرم افزار شما از 100 مگابایت بیشتر نباشد تا بتوانید آن را در گوگل پلی منتشر نمایید.
فرمت نرم افزار: اینک دو فرمت بوسیله گوگل برای نرم افزار های اندروید به وسیله گوگل پذیرفته میگردند: فولدر های Apk و App Bundle. نرم افزار های App Bundle با پسوند .aab شناخته میشوند و فعلا از مقبولیت بیشتری نسبت به فولدر های apk نزد گوگل برخوردارند.

قدم چهارم – تشکیل داد نرم افزار در Google Console
بعداز این کلیه فرایند بالا را اعمال دادیم، وهله به مرحله جالب تصویب نرم افزار در گوگل پلی می رسیم. درین مرحله یک برنامه نو را در کنسول مرتبط با اکانت دولوپری خویش می‌سازیم. برای اینکار نیاز میباشد تا روند پایین را اجرا دهید:

به نصیب All Applications در منوی کناری بروید
بر روی دکمه Create Application بزنید
از منوی Drop-Down، لهجه مهم نرم افزار خویش را گزینش نمایید
اسم نرم افزار (Title) را در بخش درنظرگرفته شده بنویسید
بر روی دکمه Create کلیک نمائید تا برنامه شما ساخته گردد

جهت اگاهی از “ارزش پیاده سازی نرم افزار” کلیک فرمائید.

قدم پنجم – کامل شدن داده ها
این مرحله در فرایند تکثیر نرم‌افزار در گوگل پلی، مرتبط با کامل شدن داده ها مرتبط با طریق اکران نرم افزار شما در گوگل پلی میباشد. درین نصیب، همه بخش های الزامی با آرم * در کنارشان مشخص و معلوم گردیده اند. داده ها این نصیب به بخش های متعدد تحت تقسیم میگردند:

بخش داده ها جنس (Product Details):
درین نصیب اطلاعاتی نظیر اسم (Title)، توضیحات کوتاه (Short Description) و توضیحات بی نقص (Full Description) را وارد می‌کنیم. بایستی اعتنا داشت که حداکثر اندازه اسم نرم افزار 50 کاراکتر، برای توضیحات کوتاه 80 کاراکتر و توضیحات بی نقص تا حداکثر 4000 کاراکتر میباشد. همینطور اعتنا نمایید که بیشتراز اندازه از واژه و کلمه کلیدی مد حیث خویش در‌این توضیحات به کارگیری نکنید تا از حیث seo نیز بتوانید اپلیکیشنی مطلوب را در گوگل پلی منتشر فرمائید.

نصیب اسکرین شات ها (Screenshots):
درین قسمت شما میتوانید تصاویری را از گوشه و کنار نرم افزار خویش آپلود کنید تا به یوزرها اکران داده خواهد شد. در‌این نصیب شما می‌توانید در بین 2 تا 8 اسکرین شات را برای نرم افزار خویش به کار گیری نمائید. نیازمندهای گوگل پلی برای این اسکرین شات به طور پایین میباشد:

فرمت عکس های بایستی JPEG و یا این که 24-bit PNG باشد
رزولوشن عکس های از 320 تا 3840 پیکسل متناسب با دستگاه های متفاوت میباشد
نسبت بخش برتر عکس به بخش کوتاه خیس آن نباید بیشتر از 2 باشد

بخش آیکون (Icon):
درین نصیب آیکون نرم افزار خویش برای اکران در گوگل پلی را آپلود می‌کنید. اعتنا داشته باشید که آیکون شما می بایست وضعیت پایین را داشته باشد:

فرمت آن 32-bit PNG باشد
سایز آن 512 در 512 پیکسل باشد
حداکثر سایز آن نیز 1 مگابایت میباشد

بازدید : 11
يکشنبه 8 تير 1404 زمان : 16:14


رئیس پوشه برای موبایل اندرویدی
در صورتی‌که که از عشق و علاقه‌مندان به اندروید پرسیده گردد که چرا پلتفرم اندروید را به iOS ترجیح می دهند، احتمالا اکثری از آنان این جواب را میدهند که اندروید با یک نرم‌افزار کاربردی رئیس پوشه (File Manager) ارائه می گردد که امکان تشکیل داد فایل‌ها و جابجایی پوشه‌ها به مسیرهای متفاوت را برای مخاطب به آسانی آماده می‌نماید. اگرچه، این اپ‌های کاربردی بیشتر محصور به نرم‌افزار‌نویس‌ها گردیده‌اند و همگی داده‌های مو جود در تلفن همراه هوشمند اندرویدی را به مخاطب معمولی طراحی اپلیکیشن در مشهد اکران نمی‌دهند.

چرا که هر اپ‌ای که نرم افزار‌نویس می‌نویسد و نرم‌افزار کاربردی که بیلد (Build) می‌نماید به طور یک فولدر در دستگاه اندرویدی اکران داده میشوند، نیاز به یک جستجوگر فولدر (File Explorer) برای یافت کردن و ویرایش فولدر‌ها میباشد. درین راستا، می‌اقتدار از مدیرفایل پیش‌فرض موبایل و یا این که دیگر رئیس فولدر‌های گوناگونی که برای اندروید وجود دارا هستند بهره مند شد. مثلا مدیرفایل‌های مطلوب برای این فعالیت می‌قدرت به OI File Manager اشاره نمود. OI File Manager یک جایگزین متن‌گشوده و بدون پول برای کاوش گر پوشه اندروید میباشد که به مخاطب قابلیت جا‌به‌جایی، تغییر تحول اسم و به اشتراک‌گذاری سهل وآسان فولدر‌ها را میدهد.

دانلود OI File Manager از گوگل پلی [+]
نمایشگر مدیر منبع
در حالتی که که اپلیکیشن‌نویس یک نرم‌افزار کاربردی بر طبق اینترنت را توسعه و گسترش دهد، داشتن یک نمایشگر رئیس منبع (View Source Handler) الزامی میباشد. View Source به مخاطب این قابلیت و امکان را می دهد که کد منبع خویش را با تایپ کردن نشانی URL در یک مرورگر، مشاهده نماید. View Source Mobile به طور یک پلاگین در مرورگرهای موبایلی مانند اپرا گوشی (Opera Mobile)، دلفین (Dolphin) و فایرفاکس قابل استعمال میباشد. به صورت جایگزین، می‌اقتدار از نرم‌افزار‌ای که به آن VT View Source گفته میگردد استفاده نمود که تحت عنوان یک مرورگر غیروابسته دارنده امکان‌هایی مانند پلاگین‌ها و خصوصیت‌های منحصر برای بسط‌دهندگان میباشد.

دانلود VT View Source از گوگل پلی [+]

اینترنت سرور برای آزمایش نرم‌افزار‌های کاربردی اینترنت
توسعه و گسترش‌دهندگان یک اینترنت‌وب سایت و نرم افزار‌های کاربردی مطابق اینترنت نیاز به اینترنت سرور‌هایی برای ذخیره‌سازی فولدر‌هایی دارا هستند که می‌اقتدار به آنان بوسیله یک استفاده کننده مقصود و از روش وب دسترسی داشت. وقتی که فردی از اینترنت‌وبسایت مخاطب و یا این که از اپلیکیشن کاربردی آن به طور آنلاین بازدید می‌نماید، مرورگر آن با اینترنت سرور تعامل می‌نماید و داده ها را برای تشخیص اینکه چه چیزی روی کاغذ اکران یوزرها اکران داده میشود مبادله می‌نماید. اینترنت‌تارنما‌های آنلاین متداول اینترنت سرور را با ارزش‌های متنوع در دست یوزرها قرار میدهند.

اینترنت‌سرورهای محلی با هدف ها آزمایش و طبقه‌بندی با به کار گیری از XAMPP و WAMP قابل ایجاد کرد می‌باشند. این مفاد، مثلا دوستداشتنی‌ترین بسته‌های اینترنت سرور برای کامپیوترهای فردی می باشند. مثال‌های مشابهی نیز روی اندروید برای استفاده کننده وجود داراست که می توانند از آنها به کارگیری نماید. یک کدام از شایسته ترین اینترنت سرورها برای این فعالیت در اپلیکیشن نویسی اندروید با تلفن همراه های اندروید Palapa Web Server میباشد که به اپ‌نویس PHP ،MySQL و Lighttpd از پیش تنظیمات گردیده را در یک بسته و به طور بدون‌پول ارائه می‌نماید. همینطور می بایست به‌این نکته دقت داشت که راه اندازی یک خدمت محلی روی یک تلفن همراه اندرویدی با مشقت ارزش مطلوب‌خیس، ممکن میباشد گوشه و کنار و امکان کافی برای در دست گرفتن اینترنت سرور را مهیا نکند.

دانلود Palapa Web Server از گوگل پلی [+]
بقیه ابزارهای مایحتاج
اگرچه مفاد گفته شده در صدر، ابزارهای هسته‌ای مورد نیاز برای نرم‌افزار نویسی اندروید با تلفن همراه های اندروید می‌باشند، اپلیکیشن‌های کاربردی دیگری نیز برای ارتقاء نرم‌افزار نویسی اندروید در تلفن همراه های اندروید وجود دارااست. این آیتم به ویژه برای هنگامی مطلوب میباشد که شخص موبایل خویش را اصطلاحا روت (Root) نموده باشد و در واقع، مخاطب ریشه باشد. مثلا، درصورتی که استفاده کننده اپ‌نویس تلفن همراه‌های هوشمند میباشد، ممکن میباشد بخواهد دسترسی اپ‌ها را به طور دستی تغییر تحول دهد و تهیه و تنظیم نماید. برای این مقصود، SuperSU یک ابزار خوب برای در اختیار گرفتن کردن تلفن همراه هوشمند تحت عنوان یک موبایل هوشمند روت شد‌ه‌است.

دانلود SuperSU از گوگل پلی [+]
خلال این مورد ها، موبایل هوشی اندرویدی حقیقتا یک کامپیوتر فارغ از خط دستور وجود ندارد. در واقع، مشابه‌ساز ترمینال اندروید (Android Terminal Emulator) قابلیت و امکان‌هایی را در‌این راستا در چنگ مخاطب قرار می دهد. با دانلود و نصب اپ BusyBox Free می‌اقتدار امکان های گنو/لینوکس بیشتری را به مشابه‌ساز ترمینال اضافه کرد.


دانلود BusyBox Free از گوگل پلی [+]
در شرایطی که که حریم محرمانه و امنیت از حق تقدم‌های استفاده کننده باشد، Orbot و ChatSecure بین نرم‌افزار‌های کاربردی قرار دارا‌هستند که نرم افزار‌نویس با استعمال از آن ها می تواند تجارب نرم‌افزار نویسی اندرویدی روی تلفن همراه های اندروید بهتری داشته باشد. ChatSecure قابلیت شبکه رمز گذاری گردیده برای چت OTR را میدهد.

برخی از کاربردی‌ترین ابزارها برای نرم‌افزار نویسی اندروید با موبایل های اندروید
در پی، برخی از کاربردی‌ترین ابزارها برای نرم‌افزار نویسی اندروید با موبایل های اندروید معرفی گردیده‌اند.

Anjedi
یکی‌از شایسته ترین مورد‌ها برای نرم افزار‌نویس جاوا در موبایل‌های اندرویدی، Anjedi میباشد. Anjedi یک نرم‌افزار کاربردی میباشد که پوشه‌ها را با متافور پروژه رئیس می‌نماید. وقتی که نرم افزار گشوده می شود، یک فهرست از پروژه‌هایd ;i وجود دارااست در مقابل مخاطب قرار می گیرد و استفاده کننده میتواند یک منو از عملیات پروژه را بیاورد. برای استارت کردن بازنویسی فولدر‌های منبع، مورد‌ای با تیتر «Review Files» بایستی در اپ گزینش گردد. این آیتم یک تعیین‌گر پوشه مودال (Modal) را می‌آورد و بعداز آن، یک ویرایشگر خوب را بعد از تعیین فولدر اکران می دهد. هرچند این مراحل ممکن میباشد صبر‌فرسا محسوب خواهد شد، ولی متناسب با موقعیت اپلیکیشن، غیرمنطقی وجود ندارد.

نقطه نقط ی اوج نرم افزار Anjedi در حمایت توکار از مخازن SVN و گیت میباشد. زمانی که یک پوشه گزینش شد، این مراحل میتواند پرزحمت محسوب گردد. ولی ولی قبل از اینکه اپلیکیشن‌نویس هرم پروژه‌های خویش را در آن وارد (Import) نماید، می بایست با خبر باشد که Anjedi نسبتا به ساختار کد وارداتی حساس میباشد.

دانلود Anjendi [+]
DroidDevelop/JavaIDEDroid
درین قسمت از مقاله، به معرفی DroidDevelop و JavaIDEDroid پرداخته شد‌ه‌است. این دو اپ به صورت مستقل‌ای در مغازه‌های قابل انعطاف‌افزارهای اندرویدی قرار دارا هستند. در‌حالتی که که استفاده کننده استعمال از DroidDevelop را گزینش نماید، متعاقبا و مطلقا نیاز به JavaIDEDroid نیز خواهد داشت. در عین درحال حاضر، تعلق‌ها نیز در‌این مرحله به نقطه نهایی نمی رسند و استفاده کننده به OIFileManager و پوشه android.jar از Android SDK به مراد مهیا آوردن قابلیت و امکان کامپایل JavaIDEDroid نیاز خواهد داشت.

این دو اپلیکیشن واقعا بدین فلسفه یونیکس پایبند میباشند که تنها یک نرم افزار وجود داشته باشد اما شغل خویش را به شایسته ترین نحو جاری ساختن دهد. در حالی که وجود اینگونه ایده‌ای برای سیستم‌های دسکتاپ و سرور خیلی بهتر میباشد، در دنیای انحصاری قابل انعطاف‌افزارها و برگه‌کلیدهای قابل انعطاف‌افزاری این گزینه واقعا تجارب ناخوشایندی به مکان خواهد گذاشت.

جابجایی یک پروژه اندروید مو جود به DroidDevelop کاری سختی‌آور خواهد بود و نیاز به آن دارااست که یک پوشه بش (Bash) در فولدر ریشه پروژه وجود داشته باشد تا به آن بگوید که کدام فرمان را و به چه ترتیبی جاری ساختن نماید. برای یک مخاطب زبده، این عمل واقعا انعطاف‌پذیر خواهد بود، البته یادگیری کیفیت جاری ساختن این عمل واقعا کاری بغرنج خواهد بود؛ به ویژه هنگامی که استفاده کننده بخواهد یک پروژه جان دار را روی دستگاه اندرویدی خویش بسازد.

این ویرایشگر عاری از خصوصیت‌های مازاد و فقط دارنده خصوصیت‌هایی درحد دستکاری متن، داشتن شماره خطوط، اصلاح هجی اندروید به طور توکار و موردها شبیه این چنینی میباشد. یک نکته قابل توجه که بایستی پیرامون DroidDevelop به آن دقت داشت این میباشد که در حالتی که دکمه جاری ساختن (Run) قبل از یک کامپایل غالب زده خواهد شد، اپ هنگ می‌نماید. زمانی که دور و بر کامپایل و ایفا فعال‌ساز‌ی شد، DroidDevelop به اندازه کافی رمز راست میباشد که بتوان دستکاری‌ها را جاری ساختن بخشید.

دانلود DroidDevelop [+]
دانلود JavaIDEDroid از گوگل پلی [+]

بازدید : 48
شنبه 7 تير 1404 زمان : 12:45


نوتیفیکیشن های اندروید برای گسترش دهندگان – به لهجه معمولی
اعلان یا این که «نوتیفیکیشن» (Notification) یکی‌از سریع‌ترین و سهل وآسان‌ترین شیوه‌ها برای ارتقا تعامل‌پذیری و جذب مخاطب به نرم افزار محسوب میشود. نوتیفیکیشن، چکیده کوتاهی از اطلاعاتی که مخاطب می بایست در لحظه سرازیر بداند را در دست او قرار میدهد. نوتیفیکیشن‌ها همینطور به یوزرها قابلیت و امکان میدهند که در قبال رویدادهای گوناگون تخت گاز اقداماتی اتخاذ نمایند. ما در‌این نوشته به نظارت نمونه‌های پرکاربرد از نوتیفیکیشن اندروید میپردازیم تا بتوانید در کمترین فرصت ممکن به یوزرها خویش طراحی اپلیکیشن در مشهد اگاهی‌رسانی نمایید.
تشکیل داد یک نوتیفیکیشن اندروید
اولیه قدم برای اکران یک نوتیفیکیشن برای مخاطب، تشکیل داد یک «شیء نوتیفیکیشن» میباشد. نوتیفیکیشن با به کار گیری از یک NotificationCompat.Builder ساخته میشود. کمینه اطلاعاتی که برای اکران یک نوتیفیکیشن لازم میباشد تنهاً مشمول یک آیکون خرد می شود. این تمامی موردها ضروری را مشمول میگردد؛ البته چندان موءثر وجود ندارد. نوتیفیکیشن‌ها بایستی برای مخاطب موءثر باشند و از این رو عموماً دربرگیرنده یک تیتر و متن می باشند.


کلیک نمایید
به دنبال نموداری از یک نوتیفیکیشن معمول را می‌بیند که قسمت‌های اصلی توضیح داده گردیده‌اند.

آیکون خرد در «نوار حالت» (status bar) اکران مییابد و مورد نیاز میباشد بدانید که رنگ آن در طی اکران رسم می‌گردد. استدلال این موضوع آن میباشد که‌این آیکون می بایست شبکه آلفا داشته باشد، زیرا در شرایطی که اینگونه نباشد، در غایت به مکان رنگ خاص برندتان با یک آیکون سپید در نوار موقعیت مواجه خواهید شد.
تیتر محتوا نیز اصلی میباشد. این تیتر می بایست توصیفی کوتاه از آن چه نوتیفیکیشن اکران میدهد باشد.
متن مهم محتوا جزئییات نسبتاً بیشتری از نوتیفیکیشن ارائه می‌نماید. درباره‌ی معیار وسعت متنی که در بدنه محتوا قرار می‌دهید بایستی هوشیار باشید، زیرا به صورت معمول از یک خط متن دراین جا به کارگیری می گردد.
آیکون گرانقدر یک پوشه «نقشه‌بیتی» (Bitmap) میباشد که به نوتیفیکیشن مربوط می گردد. این پوشه قادر است هر چیزی مانند یک تصویر پروفایل باشد.
کد لازم نسبتاً بی آلایش میباشد و در حالتی‌که بخواهید آن را به طور تجمیع گردیده مشاهده کنید به طور تحت خواهد بود:

1val notification = NotificationCompat.Builder(context, CHANNEL_ID)
2 .setSmallIcon(R.drawable.ic_announcement)
3 .setContentTitle(title)
4 .setContentText(body)
5 .build()

اکران یک نوتیفیکیشن
در حال حاضر که نوتیفیکیشن ما ایجاد شده است می بایست روشی برای نماد دادن آن بیابیم. اندروید یک خدمت سیستمی برای اکران نوتیفیکیشن به استفاده کننده ارائه می‌نماید. این خدمت با اسم NotificationManagerCompat به نرم افزار قابلیت می دهد که به مخاطب اعلانی را اکران دهد. به‌این خواسته بایستی از یک notificationId و نوتیفیکیشنی که ساخته‌ایم استعمال کنیم.

1with(NotificationManagerCompat.from(context)) {
2 if (getNotificationChannel(CHANNEL_ID) == null) {
3 createNotificationChannel(context)
4 }
5 notify(notificationId, builder.build())
6}

همانگونه که میبینید در کد فوق، یه خرده پژوهش‌های بیشتر نیز وجود داراست که مشمول رسیدگی وجود یک شبکه نوتیفیکیشن میباشد.

شبکه‌ها و اهمیتشان
شبکه‌ها در اندروید ورژن Oreo معرفی‌گردیده‌اند و به یوزرها قابلیت و امکان می دهند که درباره‌ی اعلان‌هایی که نرم افزار‌ها اکران می دهند، دست به تعیین بزنند. ما تحت عنوان پیشرفت‌دهندگان نرم افزار بایستی اعلان‌های خویش را مبتنی بر موضوعاتشان تیم‌بندی کنیم. در صورتی‌که یک نرم افزار صرفا از یک شبکه برای اکران کلیه نوتیفیکیشن‌هایش استعمال نماید، مخاطب در شکل بسته شدن آن شبکه، نمی‌تواند تصمیم بگیرد که کدام نوتیفیکیشن‌ها را میخواهد مشاهده کنید یا این که نبیند. در این صورت استفاده کننده هیچ نوتیفیکیشنی از نرم افزار اخذ نخواهد کرد.

1fun createNotificationChannel(context: Context) {
2 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
3 val name = context.getString(R.string.channel_name)
4 val descriptionText = context.getString(R.string.channel_description)
5 val importance = NotificationManager.IMPORTANCE_HIGH
6 val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
7 description = descriptionText
8 }
9 NotificationManagerCompat.from(context).createNotificationChannel(channel)
10 }
11}

شبکه می بایست داده ها تحت را داشته باشد:

ID – یک شناسه برای شبکه میباشد که قادر است یک اثبات حرفه‌ای در نرم افزار باشد.
Name – اسم شبکه که بایستی نوع نوتیفیکیشنی که شبکه ارائه می‌نماید را به استحضار استفاده کننده برساند. این متغیر میتواند کوتاه و بی آلایش باشد به عنوان مثالً «Messages» به این مراد مطلوب میباشد.
Importance – سطح مداقه نوتیفیکیشن را می‌قدرت به طور High ،Default ،Low یا این که Min انتخاب کرد. معیار اهمیتی که گزینش می کنید، در واقع بیان کنده سطح دخالت نوتیفیکیشن در حین اگاهی‌رسانی به استفاده کننده خواهد بود.
Description – این توضیح در منوی پیکربندی اندروید اکران می یابد و می بایست ریزه کاری بیشتری درباره ی این شبکه اکران دهد.

بازدید : 37
پنجشنبه 5 تير 1404 زمان : 11:26


تشکیل داد نرم افزار ضبط صدا با کاتلین (Kotlin) – به گویش معمولی
فریمورک مالتی‌مدیا در اندروید از ضبط و پخش صدا نیز تامین می‌نماید. در‌این مقاله فرآیند ایجاد کرد یک نرم افزار ضبط صدا را رسیدگی میکنیم که قابلیت و امکان ضبط کردن صدا و ذخیره‌سازی آن در خاطر داخلی دستگاه اندرویدی را دارااست. این شغل با استعمال از MediaRecorder که از سوی SDK اندروید ارائه گردیده‌است شکل می گیرد. همینطور با طریق تقاضای آنی «دسترسی‌های استفاده کننده» (User Permissions) و روش فعالیت با خاطر داخلی یک دستگاه طراحی اپلیکیشن در مشهد اندرویدی آشنا خوا‌هیم شد.
تولید رابط کاربری (UI)
آغاز می بایست رابط کاربری نرم افزار ضبط صدای خودمان را بسازیم.

این رابط از یک طرح‌بندی بی آلایش با 3 دکمه تشکیل یافته میباشد که برای شروع، تاخیر/ ازسرگیری و توقف ضبط صدا استعمال می شوند.


xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity">

android:id="@+id/textview_sound_recorder_heading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sound Recorder"
android:layout_centerHorizontal="true"
android:textSize="32dp"
android:textStyle="bold"
android:textColor="#000"
android:layout_marginTop="32dp"
/>

android:id="@+id/button_start_recording"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
android:layout_alignParentBottom="true"
android:layout_marginLeft="32dp"
android:layout_marginBottom="32dp"
android:layout_centerVertical="true"/>

android:id="@+id/button_pause_recording"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pause"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="32dp"/>

android:id="@+id/button_stop_recording"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="32dp"
android:layout_marginRight="32dp"/>

مشاهده بدون نقص کدها
تقاضای مجوزهای لازم
بعداز تولید رابط کاربری خواهیم توانست با به کار گیری از MediaRecorder استارت به تشکیل داد نرم افزار خویش بکنیم. ولی پیش از آن می بایست تایید صلاحیت دسترسی‌های موردنیاز خویش برای ضبط صدا و به کارگیری از یاد داخلی را از استفاده کننده بخواهیم. این فعالیت با یک سری خط کد معمولی در فولدر AndroidManifest.xml ممکن میباشد:

همینطور قبل از استعمال عملی از MediaRecorder مورد نیاز میباشد که نظارت کنیم آیا استفاده کننده حقیقتاً جواز دسترسی‌ها را ارائه نموده است یا این که خیر؛ این فعالیت را در پوشه MainActivity.kt ایفا می دهیم:

if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, permissions,0)
}
نکته: این خطوط کد درپی به فراخوانی OnClickListener در دکمه start_recording جابجایی خواهند یافت تا بتوانیم مطمئن باشیم که MediaRecorder فارغ از در دست داشتن دسترسی‌های مورد نیاز استارت به فعالیت نمی‌نماید.

نرم افزار ضبط صدا

ضبط و ذخیره‌سازی صدا
بعداز تنظیم مقدمات عمل فعلا وهله آن رسیده میباشد که به طور عملی مبادرت به ضبط و ذخیره‌سازی صدا بکنیم.

اضافه کردن OnClickListeners
آغاز می بایست یک OnClickListeners به دکمه‌های خویش اضافه کنیم تا مطمئن شویم که به رویدادهای جاری ساختن گردیده از سوی مخاطب جواب می دهند. همان گونه که پیش‌خیس گفتیم وجود جواز دسترسی‌های درست را قبل از اضافه کردن فراخوانی OnClickListener به دکمه start_recording رسیدگی می کنیم.

button_start_recording.setOnClickListener {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, permissions,0)
} else {
startRecording()
}
}

button_stop_recording.setOnClickListener{
stopRecording()
}

button_pause_recording.setOnClickListener {
pauseRecording()
}
مشاهده بی نقص کدها
تنظیمات MediaRecorder
بعد می بایست یک مسیر برای خروجی تمجید کرده و آغاز به تنظیمات MediaRecorder خودمان کنیم.

private var output: String? = null
private var mediaRecorder: MediaRecorder? = null
private var state: Boolean = false
private var recordingStopped: Boolean = false

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

output = Environment.getExternalStorageDirectory().absolutePath + "/recording.mp3"
mediaRecorder = MediaRecorder()

mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC)
mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
mediaRecorder?.setOutputFile(output)
}
مشاهده بدون نقص کدها
در کد فوق مسیر به سوی ریشه یاد دستگاه را یافته و اسم پوشه ضبط گردیده و نوع فولدر را به آن اضافه می کنیم. بعداز آن شیء MediaRecorder را ساخت و ساز کرده و منبع صدا، انکودر صدا، پوسته خروجی و فولدر خروجی را تعریف‌و‌تمجید میکنیم.

ضبط و ذخیره‌سازی صوت
کد گزینه استعمال برای استارت به شغل MediaRecorder در روی داد OnClickListener برای دکمه start_recording قرار می گیرد:

private fun startRecording() {
try {
mediaRecorder?.prepare()
mediaRecorder?.start()
state = true
Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show()
} catch (e: IllegalStateException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
}
}
همان گونه که مشاهده می کنید ما بایستی تابع prepare را قبل از آن که مبادرت به ضبط صدا بکنیم، فراخوانی کرده باشیم. همینطور آن را داخل بلوک try-catch جاسازی کرده‌ایم تا مطمئن شویم که نرم افزار زمانی که تابع prepares ناموفق باشد، از فعالیت نمی‌افتد.

سیاق OnClickListeners دکمه Stop تماماً مشابه به آن متدی میباشد که در قسمت پیشین تعریف و تمجید کردیم.

private fun stopRecording(){
if(state){
mediaRecorder?.stop()
mediaRecorder?.release()
state = false
}else{
Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show()
}
}
در کد فوق تحقیق میکنیم که آیا MediaRecorder فعلا و قبل از توقف عملی recording در حالا انجام میباشد یا این که خیر، زیرا نرم افزار در هنگامی که مشی stop هنگام عدم ضبط صدا فراخوانی خواهد شد، ممکن میباشد موجب از عمل افتادن نرم‌افزار گردد. بعداز آن متغیر state را به وضعیت false تغییر و تحول میدهیم تا بازدارنده این بشویم که مخاطب مجدداً روی دکمه stop بزند.

آن گاه بایستی OnClickListener را برای دکمه pause/resume تعریف و تمجید کنیم.

@SuppressLint("RestrictedApi", "SetTextI18n")
@TargetApi(Build.VERSION_CODES.N)
private fun pauseRecording() {
if(state) {
if(!recordingStopped){
Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show()
mediaRecorder?.pause()
recordingStopped = true
button_pause_recording.text = "Resume"
}else{
resumeRecording()
}
}
}

@SuppressLint("RestrictedApi", "SetTextI18n")
@TargetApi(Build.VERSION_CODES.N)
private fun resumeRecording() {
Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show()
mediaRecorder?.resume()
button_pause_recording.text = "Pause"
recordingStopped = false
}
مشاهده بدون نقص کدها
ما در‌این دو اسلوب تحقیق میکنیم که آیا MediaRecorder در اکنون ایفا میباشد یا این که خیر. در شرایطی‌که اینگونه باشد پروسه ضبط صدا را متوقف می کنیم و متن دکمه را به resume تغییر تحول میدهیم. در حالتی که دکمه مجدد کلیک خواهد شد مراحل ضبط صدا را از نقطه‌ای که باقیمانده بود از راز می گیریم.

در غایت ما می توانیم ضبط صدا را استارت کرده و با گشودن پوشه recording.mp3 که در یاد داخلی دستگاه ذخیره گردیده‌است به آن گوش دهیم.

بازدید : 13
چهارشنبه 4 تير 1404 زمان : 16:58


نرم‌افزار نویسی اندروید با کاتلین – راهنمای استارت به فعالیت
این نوشته‌ی‌علمی برای اشخاصی مطلوب میباشد که می خواهند استارت به یادگیری کاتلین بکنند و پیش‌موضوع‌ای از نرم افزار‌نویسی برای اندروید نیز دارا‌هستند، البته نمی‌دانند از کجا می بایست شروع نمایند؛ با ما یار باشید تا اپلیکیشن نویسی اندروید با کاتلین را بیاموزید. فهرست مطالبی که درین راهنما می آموزیم طراحی اپلیکیشن در مشهد به تفصیل ذیل میباشد:
کاتلین چیست؟
چرا می بایست از کاتلین در اندروید بهره برد؟
ساختار درونی کاتلین به چه شکل میباشد؟
جاوا چه تفاوتی با کاتلین داراست؟
امکان‌های جانور کاتلین کدام میباشند؟
کاتلین چیست؟


«کاتلین» (Kotlin) یک لهجه اپ‌نویسی چندمنظوره، متن-گشوده و با نوع‌بندی استاتیک برای JVM، مرورگر، نیتیو و اندروید میباشد که امکان‌های نرم افزار‌نویسی شیءگرا و اپلیکیشن‌نویسی تابعی را با هم ادغام می‌نماید.

در جولای سال 2011 میلادی JetBrains از پروژه کاتلین که زبانی برای HVM بود رونمایی کرد و بعد از آن نیز یکسال پایین پیشرفت بود.

یک کدام از هدف ها نقل شده برای کاتلین این بود که به اندازه جاوا سریع کامپایل گردد. در فوریه سال 2012 میلادی، جت‌برینز پروژه را ذیل لایسنس آپاچی 2 اوپن‌سورس کرد.

چرا نرم افزار نویسی اندروید با کاتلین سفارش میشود؟
اسم لهجه اپ‌نویسی کاتلین از جزیره‌ای به همین اسم در اطراف سنت پترزبورگ می آید. «آندری بریسلاو» (Andrey Breslav) اعلام نموده است که دسته تصمیم گفته میباشد اسم این گویش را همچون جاوا که اسم خویش را از جزیره‌ای در اندونزی گرفته میباشد، از روی این جزیره دریافت نماید.

کلیک فرمایید
کاتلین رسما از سوی گوگل برای گسترش تلفن همراه روی اندروید حمایت میگردد. از فرصت نشر اندروید استودیو 3.0 در اکتبر 2017، کاتلین تحت عنوان جایگزین برای کامپایلر استاندارد جاوا در آن گنجانده شد‌ه‌است. کامپایلر کاتلین اندروید به مخاطب قابلیت می دهد که فی مابین بایت‌کد سازگار با جاوا 6 یا این که 8 تعیین نماید.

از 7 می 2019، کاتلین به گویش ترجیحی گوگل برای بسط نرم افزار‌های اندروید تبدیل شد‌ه‌است. یا این که به گویش بی آلایش‌خیس گوگل به توسعه و گسترش دهندگان میگوید عالی میباشد اپ نویسی اندروید با کاتلین صورت بپذیرد.

سازش: کاتلین با JDK6 سازگار میباشد، از این رو دستگاه‌های کهن از گردونه عقب نمی‌مانند.
کوشش: کاتلین از نگاه عملکردی با جاوا برابری می‌نماید.
هم‌کنش‌پذیری: کاتلین 100% با جاوا مثلا با «کناره‌نویسی‌ها» (annotations) همکنش پذیر میباشد.
مجال کامپایل: در بیلد‌های منزه پاره ای سربار وجود داراست، البته در بیلدهای رو به بالا یه خرده سریع‌خیس میباشد.
منحنی یادگیری: یادگیری کاتلین به خصوص برای اشخاصی که به لهجه‌های امروزی عادت دارا هستند، سهل و آسان میباشد. مبدل جاوا به کاتلین در IntelliJ یا این که اندروید استودیو این یادگیری را هر چه بیشتر تسهیل می‌نماید. می‌اقتدار از ترکیبی از کاتلین و جاوا نیز در یک پروژه استفاده نمود، براین اساس می توانید مجال خویش را صرف یادگیری کاتلین بکنید و وقتی که به طور کاملً مطمئن بودید از آن به کار گیری عملی بکنید.
ساختار داخلی کاتلین چه گونه میباشد؟
کاتلین نیز دقیقاً مانند جاوا یک لهجه کامپایل شونده میباشد. این بدان معنا میباشد که قبل از آن که بتوانید کد کاتلین را انجام نمایید، می بایست آن را کامپایل فرمایید. در پی به توضیح کیفیت فرآیند کامپایل شدن و ابزارهای مختلفی که‌این فرآیند را تسهیل می‌نمایند میپردازیم.

کد منبع کاتلین به صورت معمول در پوشه‌هایی با پسوند kt. محافظت می‌گردد. کامپایلر کاتلین کد منبع را تحلیل می‌نماید و فولدر‌های class. را ساخت‌و‌ساز می‌نماید که دقیقاً همچون کاری میباشد که کامپایلر جاوا اعمال می دهد. به‌دنبال پوشه‌های ‎.class ایجاد گردیده، بسته‌بندی‌گردیده و با به کارگیری از راه و روش استاندارد برای نوع اپلیکیشنی که روی آن فعالیت میکنید، ایفا می شوند.

تفاوت‌های جاوا با کاتلین کدام میباشند؟
در‌این نصیب بعضا از تفاوت‌های جاوا با کاتلین را به طور عملی اکران می دهیم.

پرینت کردن در کنسول
Java
System.out.print("Amit Shekhar");
System.out.println("Amit Shekhar");

Kotlin
print("Amit Shekhar")
println("Amit Shekhar")
اثبات‌ها و متغیرها
*var (Mutable variable)

*val (Immutable variable)

Java
String name = "Amit Shekhar";
final String name = "Amit Shekhar";

Kotlin
var name = "Amit Shekhar"
val name = "Amit Shekhar"
گونه های داده
خواسته از نوع داده، نوع و اندازه داده‌هایی مربوط به متغیرها و تابع‌ها میباشد. نوع داده برای اعلان وضعیت یاد‌ی متغیر که امکان‌های داده را گزینش می‌نماید به کار گیری میشود. در کاتلین کلیه چیز یک شیء میباشد. مضمون‌ این صحبت آن میباشد که میتوانیم تابع عضو و مشخصه‌های روی هر متغیر را فراخوانی کنیم.

Number
Character
Boolean
Array
String

بازدید : 15
سه شنبه 3 تير 1404 زمان : 11:56


کتابخانه Lottie در اندروید – راهنمای کاربردی
Lottie کتابخانه‌ای جذاب میباشد که از سوی مجموعه پیشرفت Airbnb ارائه شد‌ه‌است. این کتابخانه روشی جذاب برای انیمیت گرافیک‌های برداری ارائه می‌نماید. بنابراین فرصتی بی‌غایت برای گسترش‌دهندگان دیگر گشوده گردیده‌است تا به تزیین نرم افزار خویش بپردازند. برای مثال میتوانید درین ریپوی گیت‌هاب (+) یک در دست گرفتن ناوبری تحتانی را ببینید که با به کارگیری از Lottie طراحی اپلیکیشن در مشهد برای انیمیت آیکون‌های منو پیاده سازی شد‌ه‌است و آن را جذاب ساخته میباشد.
برای فهم و شعور این پروژه می توانید به ادامه رسیدگی این راهنما بپردازید. دقت فرمائید که فولدر readme دربرگیرنده یک GIF میباشد و داخل فولدر dem نیز ویدئویی ارائه گردیده که به توضیح بی نقص دمو می پردازد.

استارت با Gradle
پیش از هر چیز بایستی موتور انیمیت کردن گرافیک‌های بُرداری را به دست آوریم که در این زمینه خویش Lottie میباشد. به‌این مراد از فرمان Gradle ذیل به کارگیری میکنیم:

implementation \'com.airbnb.android:lottie:2.8.0\'
اعتنا نمایید که ورژن 2.8.0 برای پکیج‌های اندروید لازم میباشد. در غیر این شکل می بایست از ورژن 2.6.0 درین نمونه استعمال فرمائید.

کلیک نمائید
Lottie چیست؟
درین نصیب آغاز با فولدر‌های Lottie آشنا می‌شویم. این‌ها در واقع برنامه کودکان‌های Adobe After Effects می‌باشند که به طور JSON با Bodymovin اکسپورت گردیده‌اند. وقتی که JSON به دست آید، مسئولیت کتابخانه Lottie چک این JSON و رندر این گرافیک‌های انیمیت گردیده‌است. درین پیوند (https://www.lottiefiles.com) میتوانید پوشه‌های JSON متعددی را چشم و آن‌ها‌را آزمون فرمائید.

متدهای اثرگذار LottieAnimationView
کامپوننت view که مسئول اکران کارتون‌های Lottie میباشد LottieAnimationView به حساب می آید. این view اسم فولدر Lottie که می بایست استعمال شود را می گیرد و در طی مقتضی این گرافیک انیمیت گردیده را اکران میدهد.

یکسری مشی از سوی این کلاس ارائه گردیده‌اند که اصولاً ImageView میباشند. آنان‌را می‌اقتدار روی یک XML تهیه و تنظیم کرد و یا این که از Java/Kotlin فراخوانی کرد.

Loop – این روال انتخاب می‌نماید که برنامه کودک در یک چرخه تکراری بازپخش گردد یا این که خیر.
autoPlay – در صورتی true باشد به محض چک فولدر Lottie و اکران یافتن آن، اجرای کارتن استارت می شود.
Progress – آن را می‌قدرت یک اسلایدر برای ویدیو در لحاظ گرفت. Progress (0 تا 100) را می‌اقتدار برای برنامه خردسالان انتخاب کرد.
playAnimation – در حالتی که autoPlay به طور false باشد، کارتون متوقف می‌گردد. از آن می‌اقتدار برای آغاز پخش برنامه کودک استفاده نمود.
pauseAnimation - برنامه کودکان را متوقف می‌نماید.
listener-های کارتون (Animator.AnimatorListener) را می‌اقتدار به LottieAnimationView اضافه کرد تا در زمینه‌ی شرایط برنامه خردسالان به‌روزرسانی‌هایی اخذ نمایند.

پوشه‌های Lottie را کجا نگه داریم؟
فولدر‌های Lottie یا این که در assets مراقبت می گردند و یا این که در فایل raw باطن فایل res اندروید ذخیره میگردند. کتابخانه Lottie اسلوب غیروابسته‌ای برای گزینش اسم فولدر دارااست و مراحل بار گذاری آن ها از سوی کتابخانه رئیس می شود.

کاربرد
کاربرد را با استعمال از کتابخانه LottieBottomNav که تولید کرده‌ایم تعریف میکنیم. پیش از هر چیز می بایست بدانیم که LottieBottomNav نمای BottomNavigation را پیشرفت نمی‌دهد بلکه LinearLayout را گسترش میدهد. به همین عامل میباشد که نمی‌توانیم از Lottie روی BottomNavigationView به کار گیری کنیم.

public class LottieBottomNav extends LinearLayout
جهت‌گیری را به طور horizontal تهیه و تنظیم میکنیم و gravity نمای فرزند را روی center قرار می دهیم به نحوی که کنار هم در راءس linear layout اکران می یابند.

این لی‌آوت از MenuItems برای اکران آیکون‌ها و متن به کارگیری می‌نماید. لی‌آوت به طور پایین تعریف و تمجید شد‌ه‌است:

1
2
3
4 5 xmlns:tools="http://schemas.android.com/tools"
6 android:layout_width="wrap_content"
7 android:layout_height="wrap_content"
8 android:id="@+id/menu_container"
9 android:background="@android:color/transparent"
10 android:orientation="vertical">
11
12 13 android:layout_width="@dimen/menu_width"
14 android:layout_height="@dimen/menu_height"
15 android:id="@+id/lmi_menu_item"
16 android:layout_gravity="center"
17 />
18
19 20 android:layout_width="wrap_content"
21 android:layout_height="wrap_content"
22 android:id="@+id/lmi_menu_text"
23 android:textSize="@dimen/unselected_text_size"
24 android:layout_gravity="center"
25 tools:text="Item 1"
26 />
27
28
29
30
مشاهده بدون نقص کدها
براین اساس هر مورد منو دربرگیرنده یک LottieAndroidView میباشد که مسئول اکران Lottie میباشد و یک TextView میباشد که مسئول اکران اسم مورد منو میباشد.

ساخت و ساز گزینه‌های منو
هر MenuItem با به کارگیری از MenuItemBuilder قابل ساخت‌و‌ساز میباشد. MenuItemBuilder تعدادی سیاق برای تنظیمات مورد‌های منو بر مبنای موقعیت گزینش‌گردیده و غیر گزینش‌گردیده ارائه می‌نماید.

1MenuItem item = MenuItemBuilder.create("Dashboard", "home.json", MenuItem.Source.Assets, "dashboard")
2
3.selectedTextColor(Color.BLACK)
4
5.unSelectedTextColor(Color.GRAY)
6
7.pausedProgress(100)
8
9.autoPlay(false)
10
11.loop(false)
12
13.build();

برای مثال در کد فوق مورد منو برای اکران رنگ متن بر مبنای موقعیت انتخابی استعمال می گردد.

1MenuItem item2 = MenuItemBuilder.createFrom(item1)
2 .menuTitle("Gifts")
3 .selectedLottieName("gift.json")
4 .unSelectedLottieName("gift.json")
5 .build();

شیوه دیگر برای ایفا این عمل آن میباشد که یک مورد منوی مو جود را کلون کرده و بعد از آن صرفا مشخصه‌های لازم را تنظیمات کنیم. اعتنا نمائید که مشخصه تگ کلون یا این که اسکن نشده میباشد.

تهیه و تنظیم LottieBottomNav
وقتی که کلیه گزینه‌های منو که قرار میباشد اکران یابند، ساخت و ساز شدند، می بایست آن‌ها‌را به یک ArrayList اضافه کنیم و بعد آن را با فراخوانی setMenuItemList روی bottom nav ارسال کنیم. براین اساس مورد‌های منو تولید و اکران مییابند. دقت فرمایید که گزینه‌های منو به طور متوازن پخش می شوند و از این رو هر چه تعداد گزینه‌ها بیشتر گردد، به هم ریخته‌خیس به حیث می رسد. بیشینه تعداد سنجیده 4 میباشد.

1list = new ArrayList(4);
2list.add(item1);
3list.add(item2);
4list.add(item3);
5list.add(item4);
6bottomNav.setCallback(this);
7bottomNav.setMenuItemList(list); bottomNav.setSelectedIndex(0);

بازدید : 8
دوشنبه 2 تير 1404 زمان : 10:34


قابلیت و امکان های مدرن اپلیکیشن های اندرویدی – راهنمای کاربردی
ما به عنوان توسعه‌دهنده بعضی اوقات بایستی مسیر خود را آیتم بازنگری قرار دهیم. پلتفرم موبایل شاهد یکی سریع‌ترین تحول‌ها در صنعت IT می‌باشد. از این رو از منظر فنی شاید بتوان فرد را به خیال چسبیدن به طریق‌های قدیمی و مطمئن حل بعضی مسائل به جای پریدن از این شاخه به آن شاخه و امتحان کردن همه کتابخانه‌ها و معماری‌ها نو یا تجربه‌های درخشان، گزینه عفو وبخشش قرار داد. درین نوشته‌علمی راجع‌به برخی از قابلیت و امکان های مدرن نرم‌افزار های اندرویدی سخن می‌کنیم که در عوض چشم کاربر قرار دارا‌هستند و مورد بی‌توجهی قرار گرفته‌اند یا از سوی گسترش‌دهندگان به صدق گزینه به کارگیری قرار نگرفته‌اند.
با این که کاربران هیچ روشی برای فهم این که بعضا راه‌حل‌ها در پس‌موضوع چه مقدار تاریخ‌قبلی می‌باشند، در چنگ ندارند، ولی می‌توانند متوجه شوند که حس و ظاهر یک نرم‌افزار چه مقدار مدرن به نظر میرسد و آیا اپلیکیشن مورد نظر به خوبی با سیستمی که اجرا می‌کنند هماهنگی دارد یا نه. به کار به چنگ آوردن روندهای تازه UX گامی مهم در مسیر تکامل پلتفرم به حساب می‌آید و بایستی به صورت جمعی تلاش کنیم تا در این زمینه خوب شغل کنیم و بتوانیم تجارب کاربری نو و منسجم‌تری به کاربران طراحی اپلیکیشن در مشهد خود ارائه کنیم.

UI مقیاس‌پذیر
با تمرکز به یک دهه تجارب در موضوع نگهبانی از صفحه‌ها با هر نوع نسبت ابعادی ممکن، به نظر می‌رسد دیگر نباید شاهد مشکلاتی در قضیه حالت چندین پنجره‌ای به طور آزاد در اندروید باشیم. ولی هم چنان اغلب اپ‌ها در رئیس صحیح این قضیه اختلال دارا هستند.


کلیک فرمایید
امروزه شاهد کروم‌بوک‌هایی هستیم که اپ‌های اندرویدی را در پنجره‌های با قابلیت تغییر اندازه ایفا می‌کنند. Samsung DEX نیز فعالیت مشابهی انجام می دهد. به طور خاص One UI قابلیتی به نام pop-up view دارااست که حتی نیازمند نمایشگر اکسترنال نیز نیست. حتی ادیتور لی‌آوت اندروید استودیو امکان کشیدن گوشه پنجره پیش‌نمایش و تفحص شیوه نمایش پنجره در هر نسبت ابعادی ممکن را فراهم ساخته هست. با دقت به کلیه این موارد دیگر فرصت به کارگیری از دستورهایی مانند ذیل نقطه پایان یافته می باشد:

android:screenOrientation=\"portrait\"
android:resizableActivity=\"false\"
موقتی ما به UI-هایی نیاز داریم که به سرعت و سهولت در هر فرصت با هر اندازه شیت‌ای تطبیق یافته و حالت (State) را نیز از دست ندهند.


تغییر تحول اندازه پنجره بایستی همواره حالت کاغذ را حفظ کند، البته لی‌آوت می‌تواند خود را طوری بازچینی کند که از اندازه جدید بیشترین بهره را چیره شود.
اکثری از کتابخانه‌های جتپک سبب ساز شده‌اند استحصال به چنین وضعیتی بسیار آسوده‌تر از آن چه به نظر میرسد شود. یک کدام از معمولی‌ترین نحوه‌ها برای نیل به‌این مقصود، غیر وابسته نگه‌داشتن کامل لایه داده از نما است و ViewModel به طور خاص به‌این منظور اخلاق گردیده است. صرف مقداری زمان بیشتر برای تأمل در مورد مدیریت رویدادهای چرخه عمری نیز می‌تواند به حل این مشکل‌های بالقوه کمک کند. نکته دیگری که می‌تواند بازیابی موقعیت را با اختلال مواجه سازد، پشته‌سازی خطا فرگمان است که با بهره‌گیری از کامپوننت Navigation (+) می‌توان از آن اجتناب کرد.

در طی پیاده‌سازی UI حقیقی و واقعی، می‌توانیم در اکثر وقت ها مورد ها حاد بیشترین امداد را از ConstraintLayout به همدم resource qualifiers بگیریم. در صفحه‌هایی که لیست را نمایش میدهند، یک GridLayoutManager با تعداد span دینامیک نیز قادر است ابزار مفیدی محسوب شود.

با در نظر گرفتن همگی موارد، پناه از شرایط چند پنجره‌ای به طور آزاد، بیشتر چالش تیم طراحی به حساب میآید تا تیم توسعه، چون در حالتی که معماری به طور کاملً به توجه طراحی شده باشد، قابلیت ذخیره‌سازی و بازیابی صحیح موقعیت پس از تغییرات پیکربندی وجود خواهد داشت.

مدیر حفره‌های پنجره
ناچ‌های نمایشگر و دوربین‌هایی که در حفره‌های روی نمایشگر جاسازی شده‌اند، فضای متغیری از ورقه را اشغال می‌کنند و به نقص‌ جدیدی تبدیل شده‌اند. اما دراین مورد API-های تازه قابلیت و امکان رسم هر محتوایی را زیر نوارهای سیستمی مهیا می‌سازند و همچنین بخش‌های مهم اطلاعات را بسته به وضعیت حفره‌های نمایشگر به شیوه شگفت‌انگیزی بدون نیاز به فعالیت زیاد از حفره‌ها بدور میسازند.


با این که محتوا روی تک تک سطح برگه رسم میگردد، اما دوربین 3 بعدی روی مرکز حوزه‌ قابل استفاده تمرکز دارد. این نقطه تمرکز در محل تقاطع دو قطر قابل شناسایی می باشد. این نقطه به صورت دینامیک بر پایه ی نواحی غیر قابل استفاده نمایشگر تعریف شده است.
کتابخانه Insetter ساخته Chris Banes پیچیدگی باطل کردن متد ()dispatchApplyWindowInsets مربوط به ViewGroup یک root سفارشی و یا نوشتن یک OnApplyWindowInsetsListener سفارشی را رفع می‌کند. این نکته را نباید فراموش کنیم، زیرا نمی‌خواهیم اپلیکیشن را در موقعیت عمودی قفل کنیم. براین اساس نه تنها می بایست با inset-های بالا و پایین بلکه باید به هر چهار جهت اعتنا کنیم.

همچنین بایستی به تهیه خصوصیت android:windowLayoutInDisplayCutoutMode قالب اپلیکیشن روی shortEdges دقت داشته باشیم، زیرا این کار موجب می شود که UI در شرایط افقی تحت حفره‌های نمایشگر نیز کشیده شود. این وضعیت مخالف وضعیت پیش‌فرض می‌باشد که در آن این کار صرفاً در حالت عمودی جاری ساختن می‌یابد.

فایده این عملکرد اندک برای طراحی صحیح، یک نرم‌افزار خوب خواهد بود که از مزیت نمایش روی کل ورقه به جای محدود شدن به نواحی خارج از نوارهای مشکی سیستمی منفعت‌مند می‌گردد.

جانبداری از حالت تیره
در‌حالتی که اپلیکیشنی که طراحی می کنیم فقطً از پس‌قضیه روشن امان کند بسیاری از کاربران همت خواهند کرد پس از غروب آفتاب و در مناطق تاریک از آن استفاده نکنند. امروزه اغلب اپلیکیشن‌ها از طراحی متریال تیره بهره می‌گیرند و در صورتی‌که نرم‌افزار شما چنین حالتی نداشته باشد، عقب باقی مانده به حیث می‌رسد.


لیک فرمایید
همین حرف را می‌توان در زمینه ی سمت دیگر نیز اظهار کرد. برخی کاربران تم روشن را ترجیح میدهند که در تحت نوروفروغ مستقیم آفتاب بهتر دیده می‌گردد. چاره این نقص‌ هویدا است. کاربران به حق انتخاب نیاز دارند و ما باید از نخستین فرآیند طراحی نرم‌افزار از هر دو آیتم تیره و روشن پشتیبانی کنیم.
ولی میدانیم که به هر اکنون دیر وصال خوب از هیچ گاه نرسیدن میباشد. شرایط شب دیگر در قسمت آیتم‌های پیشرفت‌دهنده موبایل مخفی نشده میباشد. امروزه هر که قادر است ترجیح خویش را در میان پوسته‌های تیره و پر‌نور در هر مجال تعیین نماید، ولی ممکن میباشد حاصل این شغل بر طبق انتظار آنان نباشد. iOS در این مورد بسیار پیشروتر میباشد. یک کلید اساسی میتواند در امر سوئیچ در بین پوسته تیره و پر‌نور برای هر نرم افزار منفرد استعمال شود، البته در اندروید، پیاده‌سازی‌های منفرد بسیار نامنسجم می‌باشند.

دراین باره با به عبارتی مشکلی مواجه هستیم که در طول کدنویسی در خصوص تهیه و تنظیم گویش در سطح سیستمی از سوی استفاده کننده مواجه می‌شویم. هر نرم افزار از انتخابگر پوسته سفارشی خاص خویش فایده میگیرد. این که‌این حالت یک اختلال به حساب می‌آید یا این که خیر قابل دعوا میباشد، البته دست‌کم موافق هستیم که بایستی یک مورد پیش‌فرض برای پیگیری ترجیح سراسری سیستمی وجود داشته باشد.

پیاده‌سازی عملی حفاظت از پوسته دوگانه برای یک پروژه نو فعالیت چندان دشواری محسوب نمیشود، البته در امر نرم افزار‌های کهن ممکن میباشد شغل تماماً مشقت باشد. Qualifier-های منبع night و notnight احتمالاً شایسته ترین محل برای آغاز عمل می باشند، البته به کار گیری از ویژگی‌های سفارشی به مکان ترجیح‌های بدون واسطه رنگی نیز آیتم‌ای میباشد که می‌قدرت آیتم رسیدگی قرار بخشید.

تعداد صفحات : 90

درباره ما
موضوعات
آمار سایت
  • کل مطالب : 905
  • کل نظرات : 0
  • افراد آنلاین :
  • تعداد اعضا : 0
  • بازدید امروز :
  • بازدید کننده امروز : 0
  • باردید دیروز :
  • بازدید کننده دیروز : 0
  • گوگل امروز :
  • گوگل دیروز :
  • بازدید هفته :
  • بازدید ماه :
  • بازدید سال :
  • بازدید کلی :
  • <
    پیوندهای روزانه
    اطلاعات کاربری
    نام کاربری :
    رمز عبور :
  • فراموشی رمز عبور؟
  • خبر نامه


    معرفی وبلاگ به یک دوست


    ایمیل شما :

    ایمیل دوست شما :



    لینک های ویژه