Omid Zakeri

مدیر انجمن
  • تعداد ارسال ها

    114
  • تاریخ عضویت

  • آخرین بازدید

  • Days Won

    30

Omid Zakeri last won the day on دسامبر 5 2017

Omid Zakeri had the most liked content!

اعتبار در انجمن

78 Excellent

5 دنبال کننده

درباره Omid Zakeri

  • درجه
    توسعه دهنده حرفه ای

آخرین بازدید کنندگان نمایه

851 بازدید کننده نمایه
  1. Floating action menu مفهومی جدید است که در برنامه های موبایل و وب سایت ها استفاده می شود. امروزه برخی سایت ها و برنامه های محبوب از Floating action menu از جمله صندوق ورودی استفاده می کنند. این برای اقدام سریع با گزینه های متعدد مانند آپلود عکس، ویدئو، نوشتن یادداشت و غیره استفاده می شود. Floating action menu برای یادداشت برداری کاربرد مفید است. در این آموزش، شما یاد می گیرید که Floating action menu را در برنامه خود اضافه / پیاده سازی کنید. ابتدا dependencies زیر را اضافه کنید: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.0' compile 'com.android.support:design:23.1.0' compile 'com.github.clans:fab:1.6.2' } ساخت یک Layout به نام material_design_floating_action_menu.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fab="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.github.clans.fab.FloatingActionMenu android:id="@+id/material_design_android_floating_action_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="11dp" android:layout_marginLeft="11dp" android:layout_marginRight="11dp" fab:menu_animationDelayPerItem="55" fab:menu_backgroundColor="@android:color/transparent" fab:menu_buttonSpacing="0dp" fab:menu_colorNormal="#da3c2f" fab:menu_colorPressed="#dc4b3f" fab:menu_colorRipple="#99d4d4d4" fab:menu_fab_label="Floating Action Menu" fab:menu_fab_size="normal" fab:menu_icon="@drawable/fab_add" fab:menu_labels_colorNormal="#333" fab:menu_labels_colorPressed="#444" fab:menu_labels_colorRipple="#66efecec" fab:menu_labels_cornerRadius="3dp" fab:menu_labels_ellipsize="none" fab:menu_labels_hideAnimation="@anim/fab_slide_out_to_right" fab:menu_labels_margin="0dp" fab:menu_labels_maxLines="-1" fab:menu_labels_padding="8dp" fab:menu_labels_position="left" fab:menu_labels_showAnimation="@anim/fab_slide_in_from_right" fab:menu_labels_showShadow="true" fab:menu_labels_singleLine="false" fab:menu_labels_textColor="#f2f1f1" fab:menu_labels_textSize="15sp" fab:menu_openDirection="up" fab:menu_shadowColor="#66aff198" fab:menu_shadowRadius="4dp" fab:menu_shadowXOffset="1dp" fab:menu_shadowYOffset="4dp" fab:menu_showShadow="true"> <com.github.clans.fab.FloatingActionButton android:id="@+id/material_design_floating_action_menu_item1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_action_send" fab:fab_label="Menu Item 1" fab:fab_size="mini" /> <com.github.clans.fab.FloatingActionButton android:id="@+id/material_design_floating_action_menu_item2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_action_photo" fab:fab_label="Menu Item 2" fab:fab_size="mini" /> <com.github.clans.fab.FloatingActionButton android:id="@+id/material_design_floating_action_menu_item3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_action_edit" fab:fab_label="Menu Item 3" fab:fab_size="mini" /> </com.github.clans.fab.FloatingActionMenu> </RelativeLayout> کلاس اکتیویتی MaterialDesignFloatingActionMenu FloatingActionMenu materialDesignFAM; FloatingActionButton floatingActionButton1, floatingActionButton2, floatingActionButton3; public class MaterialDesignFloatingActionMenu extends AppCompatActivity { FloatingActionMenu materialDesignFAM; FloatingActionButton floatingActionButton1, floatingActionButton2, floatingActionButton3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.material_design_floating_action_menu); materialDesignFAM = (FloatingActionMenu) findViewById(R.id.material_design_android_floating_action_menu); floatingActionButton1 = (FloatingActionButton) findViewById(R.id.material_design_floating_action_menu_item1); floatingActionButton2 = (FloatingActionButton) findViewById(R.id.material_design_floating_action_menu_item2); floatingActionButton3 = (FloatingActionButton) findViewById(R.id.material_design_floating_action_menu_item3); floatingActionButton1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //TODO something when floating action menu first item clicked } }); floatingActionButton2.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //TODO something when floating action menu second item clicked } }); floatingActionButton3.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //TODO something when floating action menu third item clicked } }); } }
  2. سلام پس از تنظیم آداپتور خود به از کد زیر استفاده کنید: setListAdapter(expListAdapter); registerForContextMenu(getExpandableListView());
  3. بعضی از دوستان برای انجام onLongClick و onClick در recyclerView دچار مشکل میشن.قصد من در این آموزش انجام این اعمال در recyclerView هستش. برای این کار ابتدا باید یک کلاس جداگانه بنویسیم به صورت زیر: public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; private OnItemLongClickListener mLongListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } public interface OnItemLongClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } public RecyclerItemClickListener(Context context, OnItemLongClickListener listener) { mLongListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } بعد از اضافه کردن کلاس بالا حالا باید ازش استفاده کنیم به صورت زیر : متد onLongClick: recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), attachFileRecyclerView, new RecyclerTouchListener.ClickListener() { @Override public void onClick(View view, int position) { } @Override public void onLongClick(View view, final int position) { . . . } })); متد onClick: recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { . . . } }));
  4. سلام دوستان، در این بحث قراره Firebase Cloud Messaging رو آموزش بدیم. این بار ما درباره (Firebase Cloud Messaging (FCM بحث خواهیم کرد. ما از Firebase برای اضافه کردن cloud messaging در برنامه اندروید استفاده خواهیم کرد. Firebase Cloud Messing چیست؟ Firebase Cloud Messaging یک API قدرتمند است که به شما اجازه می دهد پیام ها را به صورت قابل اعتماد و مستقل از پلتفرمی که در حال توسعه است، ارسال کنید. با استفاده از FCM، توسعه دهندگان می توانند به کاربران اطلاع دهند که داده های جدید برای همگام سازی و ارسال پیام های اطلاع رسانی در دسترس هستند. این برای آزمایش، ارسال پیام های بازاریابی و تعامل بسیار مفید است. نکته : ما می توانیم از Firebase Cloud Message برای ارسال پیام های فوری حداکثر تا 4 کیلوبایت استفاده کنیم. یک پیاده سازی معمول از سیستم Firebase Cloud Messaging شامل یک سرور برنامه است که با FCM با استفاده از پروتکل HTTP یا XMPP و یک برنامه سرویس گیرنده ارتباط برقرار می کند. پیام ها و اعلان ها را می توان به برنامه مشتری با استفاده از سرور برنامه یا کنسول اطلاعیه های Firebase ارسال کرد. در این آموزش ما یک برنامه ساده پیامرسان اندروید firebase ایجاد خواهد کرد که کاربر در مورد firebase android قابلیت ورود به سیستم را ایجاد خواهد کرد. این پست به شما کمک می کند تا با یکپارچه سازی Firebase Cloud Messaging به اندروید کمک کنید. اضافه کردن Firebase Cloud Messaging برای اضافه کردن FCM به برنامه خود ،باید مراحل زیر را دنبال کنید: به Firebase وب سایت firebase.google.com بروید و یک حساب کاربری firebase برای شروع ایجاد کنید. به کنسول Firebase بروید و با کلیک روی دکمه «ایجاد پروژه جدید»، همانطور که در زیر نشان داده شده، یک پروژه جدید ایجاد کنید. نام پروژه و کشور شما را در حال حاضر در آن قرار دهید، پس از اتمام کار روی دکمه «ایجاد پروژه» کلیک کنید. در صفحه بعدی «افزودن Firebase به برنامه Android خود» را انتخاب کنید و سپس جزئیات مانند نام چکیج برنامه - SHA-1 key را وارد کنید. اگر مطمئن نیستید که چگونه اثر SHA-1 را تولید کنید، به این آموزش مراجعه کنید. فایل google-services.json را دانلود کنید. ما آن را بعد به برنامه اندروید خود اضافه خواهیم کرد. پیش نیازهای Firebase Cloud Messaging: Android Studio روی کامپیوتر شما نصب شده (یونیکس یا ویندوز). برای کار با Firebase باید Android Studio 1.5 یا بالاتر نصب کنید.همچنین آخرین سرویس SDK گوگل بازی را از طریق Android SDK Manager دانلود کنید. دستگاه اندرویدی (Smartphone or Tablet) با Android Studio پیکربندی شده باشد. دستگاه اندروید باید از (Android 2.3 (Gingerbread یا جدیدتر و خدمات Google Play 9.2.0 یا جدیدتر استفاده کند. Firebase SDK باید به پروژه اندروید اضافه شود، Firebase Android Tutorial Part 1 - Getting Started افزودن Permissions و Dependencies پس از همگام سازی Gradle این پروژه، فایل google-services.json را به برنامه پروژه اضافه کنید از آنجا که ما نیاز به اتصال به شبکه داریم مجوز اینترنت را در فایل AndroidManifest.xml اضافه می کنیم. همچنین هشدار لرزش را اضافه کنید در هنگام دریافت notification . AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.VIBRATE"/> همچنین برای خدماتی که FirebaseMessagingService را ارائه می دهد برای مدیریت پیام پس از دریافت اعلان ها در برنامه ها در پس زمینه service هارا اضافه کنید. برای دریافت اعلانها در برنامه این کاملا ضروری است وقتی برنامه فعال نیست notification به کاربر اعلام شود. <service android:name=".MyAndroidFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> اضافه کردن یک ورودی برای یک سرویس که FirebaseInstanceIdService را ارائه می دهد. <service android:name=".MyAndroidFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> همچنین یک ورودی برای یک activity result اضافه کنید، کاربر با کلیک کردن بر روی اعلان به این اکتیویتی بر می گردد. <activity android:name=".ResultActivity"/> در پایان فایل AndroidManifest.xml به صورت زیر خواهد بود: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.androidtutorialpoint.firebasecloudmessagingtutorial"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.VIBRATE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ResultActivity"/> <service android:name=".MyAndroidFirebaseMsgService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name=".MyAndroidFirebaseInstanceIdService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> </application> </manifest> در حال حاضر در پروژه خود build.gridle را از دایرکتوری اصلی پروژه باز کنید و dependency زیر را اضافه کنید. build.gradle classpath 'com.google.gms:google-services:3.0.0' بعد، build.gridle برنامه خود را باز کنید و در آن مقدار زیر را اضافه کنید. build.gradle apply plugin: 'com.google.gms.google-services' dependency های زیر را در قسمت dependency build.gridle برنامه خود اضافه کنید compile 'com.google.android.gms:play-services:9.2.0' compile 'com.google.firebase:firebase-messaging:9.2.1' اضافه کردن قابلیت ها یک کلاس جدید جاوا MyAndroidFirebaseMsgService ایجاد کنید و کد زیر را اضافه کنید. این کلاس یک سرویس است که FirebaseMessagingService را ارائه می دهد. import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.support.v4.app.NotificationCompat; import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; public class MyAndroidFirebaseMsgService extends FirebaseMessagingService { private static final String TAG = "MyAndroidFCMService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { //Log data to Log Cat Log.d(TAG, "From: " + remoteMessage.getFrom()); Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody()); //create notification createNotification(remoteMessage.getNotification().getBody()); } private void createNotification( String messageBody) { Intent intent = new Intent( this , ResultActivity. class ); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent resultIntent = PendingIntent.getActivity( this , 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri notificationSoundURI = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder mNotificationBuilder = new NotificationCompat.Builder( this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("Android Tutorial Point FCM Tutorial") .setContentText(messageBody) .setAutoCancel( true ) .setSound(notificationSoundURI) .setContentIntent(resultIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, mNotificationBuilder.build()); } } در دریافت پیام متد () onMessageReceived صدا زده می شود. ما از NotificationCompat.Builder استفاده می کنیم تا یک اعلان جدید با صدای اطلاع رسانی پیش فرض ایجاد کنیم و نتایج به ResultActivity منتقل می شود. ایجاد کلاس MyAndroidFirebaseInstanceIdService و اضافه کردن کد زیر. این کلاس هم یک سرویس است که FirebaseInstanceIdService را ارائه می دهد.این قسمت اطمینان میدهد که پیام ارسال شده به دستگاه های خاص موفقیت آمیز بوده است. import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; public class MyAndroidFirebaseInstanceIdService extends FirebaseInstanceIdService { private static final String TAG = "MyAndroidFCMIIDService"; @Override public void onTokenRefresh() { //Get hold of the registration token String refreshedToken = FirebaseInstanceId.getInstance().getToken(); //Log the token Log.d(TAG, "Refreshed token: " + refreshedToken); } private void sendRegistrationToServer(String token) { //Implement this method if you want to store the token on your server } } در activity_main.xml کد زیر را اضافه کنید. ما تنها یک TextView فقط برای نمایش نام اکتیویتی نیاز داریم. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView1" android:text="Welcome to Main Activity" android:textAppearance="@style/TextAppearance.AppCompat.Large" android:textStyle="bold" android:layout_marginTop="100dp" android:textAlignment="center" /> </LinearLayout> MainActivity.java package com.androidtutorialpoint.firebasecloudmessagingtutorial; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } یک اکتیویتی جدید به نام ResultActivity.java ایجاد کنید و کد زیر را در آن قرار دهید. import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; public class ResultActivity extends AppCompatActivity { private TextView textView ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.textView1); textView.setText("Welcome to the Result Activity"); } } ما از اکتیویتی activity_main.xml برای ارسال نتیجه به اکتیویتی (activity result) استفاده میکنیم . این اکتیویتی زمانی صدا زده می شود که کاربر بر روی اعلان دریافت شده کلیک کند. اکنون برنامه کامل شده است، ما با ارسال یک اعلان از پانل اعلان های Firebase، برنامه را تست می کنیم.
  5. اپلیکیشن ها به طرق گوناگون با کاربران خود تعامل برقرار می کنند و استفاده از سرویس های موقعیت یاب نیز یکی از روش های رایج برای نمایش اطلاعات شخصی سازی شده به کاربر می باشد، بدین ترتیب اپلیکیشن می تواند با دنیای فیزیکی ارتباط برقرار کرده و به افزایش تعامل کاربر منجر شود. بسیاری از اپلیکیشن ها این قابلیت را مورد استفاده قرار می دهند، اما موضوع این مطلب آموزشی پرداختن به Geofences است که اغلب نادیده گرفته می شود. Geofence یک مجموعه فضای مجازی را بر روی یک منطقه جغرافیایی واقعی تعیین می کند. با ترکیب موقعیت قرارگیری کاربر با geofence perimeter امکان فهمیدن اینکه آیا کاربر در داخل یا خارج یک geofence قرار دارد و یا در حال ورود یا خروج از یک منطقه خاص است، ممکن می شود. یک اپلیکیشن دانشگاه را تصور کنید که می تواند شما را از همکاران و استادانی که در محوطه دانشگاه قرار دارند، اگاه سازد و یا اپلیکشن یک مرکز خرید بزرگ که به مشتریان خود هدیه می دهد، احتمالات دیگری نیز وجود دارند که می توان مورد بررسی قرار داد. در این مطلب آموزشی نحوه استفاده از geofence در اندروید را فرا خواهید گرفت، ابتدا باید مجوزها را در AndroidManifest وارد کنید. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission. ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> Geofencing نیاز به سرویس API گوگل دارد. build.gridle خود را باز کنید و dependency را اضافه کنید. compile 'com.google.android.gms:play-services-location:8.4.0' پیاده سازی Geofencing : ابتدا باید بررسی کنیم آیا این سرویس دارای سرویس های Google Play نصب شده است یا خیر. int resp = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resp == ConnectionResult.SUCCESS) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(connectionAddListener) .addOnConnectionFailedListener(connectionFailedListener) .build(); mGoogleApiClient.connect(); } else { Log.e(TAG, "Your Device doesn't support Google Play Services."); } برای گرفتن آخرین مکان شناخته شده، می توانیم از API GoogleServices خود استفاده کنیم. // Create the LocationRequest object mLocationRequest = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(10 * 1000) // 10 seconds, in milliseconds .setFastestInterval(1 * 1000); // 1 second, in milliseconds دریافت موقعیت مکانی Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (location == null) { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } else { currentLatitude = location.getLatitude(); currentLongitude = location.getLongitude(); } Location Listeners @Override public void onLocationChanged(Location location) { currentLatitude = location.getLatitude(); currentLongitude = location.getLongitude(); } Now we will add both Success and Fail Listeners. private GoogleApiClient.ConnectionCallbacks connectionAddListener = new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } }; private GoogleApiClient.OnConnectionFailedListener connectionFailedListener = new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { } }; اضافه کردن Geofencing /** * Create a Geofence list by adding all fences you want to track */ public void createGeofences(double latitude, double longitude) { String id = UUID.randomUUID().toString(); Geofence fence = new Geofence.Builder() .setRequestId(id) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .setCircularRegion(latitude, longitude, 200) // Try changing your radius .setExpirationDuration(Geofence.NEVER_EXPIRE) .build(); mGeofenceList.add(fence); } ایجاد Geofencing Request private GeofencingRequest getGeofencingRequest() { GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); builder.addGeofences(mGeofenceList); return builder.build(); } افزودن PendingIntent private PendingIntent getGeofencePendingIntent() { // Reuse the PendingIntent if we already have it. if (mGeofencePendingIntent != null) { return mGeofencePendingIntent; } Intent intent = new Intent(this, GeofenceTransitionsIntentService.class); // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when // calling addGeofences() and removeGeofences(). return PendingIntent.getService(this, 0, intent, PendingIntent. FLAG_UPDATE_CURRENT); } یجاد کلاس "GeofenceTransitionsIntentService" که اکستند می کند از IntentService public class GeofenceTransitionsIntentService extends IntentService { private static final String TAG = "GeofenceTransitions"; public GeofenceTransitionsIntentService() { super("GeofenceTransitionsIntentService"); } @Override protected void onHandleIntent(Intent intent) { GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); if (geofencingEvent.hasError()) { Log.e(TAG, "Goefencing Error " + geofencingEvent.getErrorCode()); return; } // Get the transition type. int geofenceTransition = geofencingEvent.getGeofenceTransition(); if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER){ showNotification("Entered", "Entered the Location"); } else if(geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { showNotification("Exited", "Exited the Location"); } else { showNotification("Error", "Error"); } public void showNotification(String text, String bigText) { // 1. Create a NotificationManager NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); // 2. Create a PendingIntent for AllGeofencesActivity Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 3. Create and send a notification Notification notification = new NotificationCompat.Builder(this) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(text) .setContentText(text) .setContentIntent(pendingNotificationIntent) .setStyle(new NotificationCompat.BigTextStyle().bigText(bigText)) .setPriority(NotificationCompat.PRIORITY_HIGH) .setAutoCancel(true) .build(); notificationManager.notify(0, notification); } } **منبع**
  6. امروزه امنیت در تمامی زمینه هایی از اهمیت خاصی برخوردار است. برنامه نویسان اندروید نیز برای ذخیره سازی امن اطلاعات الگوریتم های مختلفی را در برنامه های خود پیاده سازی نمایند.با استفاده از این کتابخانه می توان اطلاعات استفاده شده در برنامه را به امنت ترین شکل ممکن رمزنگاری کرد.این کلاس قابلیت رمزگذاری و رمزگشایی را فراهم می کند. برای رمزگزاری کردن از روش زیر استفاده می کنیم (encryption ) public static byte[] encryptMsg(String message, SecretKey secret) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { /* Encrypt the message. */ Cipher cipher = null; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secret); byte[] cipherText = cipher.doFinal(message.getBytes("UTF-8")); return cipherText; } برای رمزگزاری کردن از روش زیر استفاده می کنیم (decryption) public static String decryptMsg(byte[] cipherText, SecretKey secret) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidParameterSpecException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException { /* Decrypt the message, given derived encContentValues and initialization vector. */ Cipher cipher = null; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secret); String decryptString = new String(cipher.doFinal(cipherText), "UTF-8"); return decryptString; } complete sample: public static SecretKey generateKey() throws NoSuchAlgorithmException, InvalidKeySpecException { return secret = new SecretKeySpec(password.getBytes(), "AES"); } public static byte[] encryptMsg(String message, SecretKey secret) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { /* Encrypt the message. */ Cipher cipher = null; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secret); byte[] cipherText = cipher.doFinal(message.getBytes("UTF-8")); return cipherText; } public static String decryptMsg(byte[] cipherText, SecretKey secret) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidParameterSpecException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException { /* Decrypt the message, given derived encContentValues and initialization vector. */ Cipher cipher = null; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secret); String decryptString = new String(cipher.doFinal(cipherText), "UTF-8"); return decryptString; } To encrypt: SecretKey secret = generateKey(); EncUtil.encryptMsg(String toEncrypt, secret)) password = omid2020 encrypt password = 0abc77ad6c67ddd2590aaeba44451c67d7939875 To decrypt: EncUtil.decryptMsg(byte[] toDecrypt, secret))
  7. ActivityNotFoundException این خطا وقتی رخ میده که برنامه سعی کنه یک اکتیویتی که وجود نداره رو اجرا کنه. معمولا وقتی این خطا پیش میاد که فراموش می کنیم اکتیویتی ساخته شده رو به فایل منیفست اضافه کنیم. ClassCastException وقتی با خطای ClassCastException روبرو میشید، یعنی دارید سعی می کنید روی دو آبجکت که از دو نوع مختلف هستن یک عملیات رو انجام بدید. مثلا وقتی که می خواید یه مقدار عددی رو به یک استرینگ اضافه کنید. برای حل کردن این مشکل کافیه از طریق لوگ، خطی که خطا اونجا رخ داده رو پیدا کنید و متغیر ها رو از یک نوع کنید. Error converting byte to dex اگر به این مشکل بر خوردید، اول پروژه رو clean کنید ( Build > Clean Project ) و سپس اون رو بازسازی کنید ( Build > Rebuild Project ) و اگر همچنان با این مشکل روبرو شدید چک کنید که آیا پکیج هایی که در کلاس هاتون استفاده کردید با اسم پکیج هایی که توی فایل منیفست هستن یکی هستن یا نه. INSTALL_FAILED_INSUFFICIENT_STORAGE این پیغام خطا به معنی این هست که فضای کافی برای اجرای برنامه وجود نداره. اگر از شبیه ساز ها استفاده می کنید میتونید از طریق منوی مدیریت AVD در شبیه ساز مورد نظر فضای بیشتری رو به اون اختصاص بدید و اگر از موبایل واقعی استفاده می کنید بهترین کار پاک کردن برنامه های بی استفاده و پاک کردن کش گوشی هست. NullPointerException شاید معروف ترین خطا در برنامه نویسی جاوا NullPointerException باشه. این مشکل وقتی پیش میاد که یک آبجکت ایجاد شده باشه اما هیچ فضایی در حافضه به اون اختصاص داده نشده باشه (null)، یا به زبان ساده تر یک آبجکت ساخته میشه اما تعریف نمیشه. مثلا کد زیر باعث ایجاد همچین خطایی میشه Object obj; obj.toString(); برای حل کردنش هم باید با استفاده از لوگ، آبجکتی که ساخته شده و تعریف نشده رو پیدا کرد و سپس مقدار دهیش کرد. R.layout.main Cannot Be Found / Cannot resolve symbol R راه حل این خطا هم مثل شماره ی ۳ کلین و بازسازی پروژست. البته گاهی انجام این کار برای یک بار مشکل رو حل نمیکنه. اگر با انجام دادن اونها ( حتی برای چندین بار) مشکل حل نشد بهتر هست کش رو پاکسازی کنید (File > Invalidate Caches / Restart ). اگر باز هم مشکل حل نشد پروژه رو چک کنید که فایل های لی آوت در کلاس ها درست استفاده شدن و در نهایت آخرین کار، ساختن یک پروژه ی جدید و انتقال کد ها به اونجاست. OutofMemoryError معمولا وقتی این خطا رخ میده که برنامه سعی می کنه از مقدار خیلی زیادی حافظه ی رم استفاده کنه. معمولا استفاده از فایل های bitmap با حجم بالا علت این خطا هست و کم کردن حجم اون معمولا مشکل رو حل می کنه. Only the original thread that created a view hierarchy can touch its views وقتی که یک UI رو بخواید از خارج از اون آپدیت کنید با همچین خطایی روبرو می شید. همیشه باید سعی بشه که از این کار پیشگیری کنید اما اگر مجبور هستید این کار رو انجام بدید از runOnUiThread استفاده کنید. Too many field references وقتی برنامه بیشتر از ۶۵۵۳۶ رفرنس داشته باشه این پیغام نشون داده میشه. در اندروید فایل هایی که به اونها dex فایل ها گفته میشه وجود داره که بیشترین تعداد رفرنس ها در هر کدوم از اونها عدد بالا هست. روش بهتر کم کردن تعداد رفرنس هاست اما در موقع نیاز میشه از چند دکس فایل استفاده کرد. NetworkOnMainThreadException وقتی بخواید عملیاتی که مربوط به شبکه هست رو در ترد اصلی استفاده کنید با این پیام روبرو میشید. به طور کلی استفاده از عملیاتی که زمانبر هست توی ترد های اصلی با خطا روبرو میشه و راه حل هم استفاده از AsyncTask هست. Activity has leaked window that was originally added here اگر از دیالوگ ها توی برنامتون استفاده کرده باشید احتمالا با این خطا روبرو شدید. این مشکل وقتی پیش میاد که یک دیالوگ در اکتیویتی ساخته شده باشه اما با از بین رفتن اکتیویتی، اون از بین نره. برای این کار کافی هست در متد onDestroy مربوط به اکتیویتی دیالوگ رو دیسمیس کنید ( dialog.dismiss() )
  8. یکی از جدیدترین تحولات در دنیای اندروید انتشار API Google Places برای Android است. این API جدید به ما دسترسی کامل به پایگاه داده گوگل برای 100 میلیون مکان می دهد. چه چیزی در مورد این API عالی است، برای دریافت داده ها از گوگل، بدون XML، یا تجزیه Json باید در مشتری انجام می شود. تمام تجزیه و تحلیل درخواست و پاسخ توسط سرویس گیرنده API Android Places انجام می شود. این به ما می دهد، بسیاری از روش های جدید راحتی که ما می توانیم به طور مستقیم به داده های API دسترسی داشته باشیم. همه ما باید انجام دهیم این است که از کلید API در پروژه استفاده کنیم. انتشار مکان های آندروید API نه تنها دسترسی به داده ها را ساده تر می کند، بلکه همچنین توسعه دهندگان را از پیگیری طول و عرض جغرافیایی می کند. پیش از این، برای دسترسی به داده های موقعیت مکانی در Android، باید تمام اطلاعات از یک سرویس وب را با عبور از پارامترهای مختلف مانند طول و عرض جغرافیایی به آن بازگردانید. API استفاده شده در آن زمان API Google Maps بود. اما اکنون خوشبختانه هیچ چیز از این نوع باید انجام شود. به عنوان مکان جدید Android API به اندازه کافی قدرتمند برای تشخیص مکان فعلی شما و بازیابی تمام داده های محل به صورت خودکار. API Google Places برای Android دارای شش ویژگی جدید است: Place Picker UI widget. Current Place . Place Autocomplete Place Add . Place Report. Place Details. این قسمت را در قسمت dependencies اضافه کنید: compile 'com.google.android.gms:play-services:8.4.0' manifest 2 3 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> permissions in the manifest <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> PlacePicker یک ویجت UI جدید است که با Places API معرفی شده است. این ویجت می تواند به شدت تلاش های توسعه را در یک سناریوی که نیاز به انتخاب یک مکان نزدیک را دارد، کاهش دهد. ویجت آندروید PlacePicker، یک نقشه و یک لیست از مکان های نزدیک را نمایش می دهد. با استفاده از این ویجت کاربر می تواند یک مکان را انتخاب کند، جزئیات آن به فعالیت تماس می شود. یکی دیگر از ویژگی های فوق العاده در مورد PlacePicker این است که اجازه می دهد سفارشی سازی هدر ها نیز داشته باشد. برای مثال اگر خواص colorPrimary و colorPrimaryDark را در styles.xml تنظیم کرده باشید. آنها می توانند در رابط کاربری PlacePicker نیز به ارث برده شوند، فقط برای حفظ یکپارچگی در جریان برنامه. سورس برنامه را دانلود کنید و از آن لذت ببرید Good Luck دانلود سورس PlacePicker-master.zip
  9. ویجت یک برنامه ی کوچک و یا یک کنترل از برنامه ی اندروید شما می باشد که در صفحه ی home قرار گرفته است. ویجت ها می توانند به راحتی در دسترس باشند، چرا که به شما اجازه می دهند تا برنامه های مورد علاقه ی خود را روی صفحه home قرار دهید تا به سرعت به آنها دسترسی داشته باشید. احتمالا چند ویجت متداول از جمله ویجت موسیقی، آب و هوا و ساعت، را دیده اید. ویجت ها می توانند انواع مختلفی داشته باشند از قبیل ویجت اطلاعات، ویجت های مجموعه، ویجت های کنترل و ویجت های چندگانه. اندروید یک چارچوب کامل به ما ارائه می دهد تا ویجت های خود را گسترش دهیم. Widget - XML file برای ایجاد یک ویجت کاربردی، ابتدا چیزی که نیاز دارید، شی Object AppWidgetProviderInfo است که شما در یک فایل XML ویجت جداگانه تعریف می کنید. برای انجام این کار، بر روی پروژه خود راست کلیک کرده و یک پوشه جدید به نام xml ایجاد کنید. حالا روی پوشه تازه ایجاد شده راست کلیک کرده و یک فایل XML جدید ایجاد کنید. نوع منبع فایل XML باید به AppWidgetProvider تنظیم شود. در فایل xml برخی از خواص را به صورت زیر تعریف می کنید: <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> Widget - Layout file حالا شما باید طرح ویجت خود را در فایل پیش فرض XML خود تعریف کنید. شما می توانید قطعات را برای تولید xml خودکار بکشید. Widget - Java file پس از تعریف طرح، در حال حاضر یک فایل JAVA جدید ایجاد کنید یا از موجود استفاده کنید و آن را با کلاس AppWidgetProvider گسترش دهید و روش بهروزرسانی آن را به صورت زیر تعریف کنید. در روش به روز رسانی، شما باید شیء دو کلاس را که PendingIntent و RemoteViews هستند تعریف کنید. نحو آن : PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main); Widget - Manifest file شما همچنین باید AppWidgetProvider را در فایل manifest خود به شرح زیر اعلام کنید: <receiver android:name="ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver> MainActivity.java package com.example.omidza.myapplication; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.widget.RemoteViews; import android.widget.Toast; public class MainActivity extends AppWidgetProvider{ public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) { for(int i=0; i<appWidgetIds.length; i++){ int currentWidgetId = appWidgetIds[i]; String url = "http://www.tutorialspoint.com"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.parse(url)); PendingIntent pending = PendingIntent.getActivity(context, 0,intent, 0); RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.activity_main); views.setOnClickPendingIntent(R.id.button, pending); appWidgetManager.updateAppWidget(currentWidgetId,views); Toast.makeText(context, "widget added", Toast.LENGTH_SHORT).show(); } } } res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:transitionGroup="true"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point" android:id="@+id/textView" android:layout_centerHorizontal="true" android:textColor="#ff3412ff" android:textSize="35dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Widget" android:id="@+id/button" android:layout_centerHorizontal="true" android:layout_marginTop="61dp" android:layout_below="@+id/textView" /> </RelativeLayout> res/xml/mywidget.xml. <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="146dp" android:updatePeriodMillis="0" android:minHeight="146dp" android:initialLayout="@layout/activity_main"> </appwidget-provider> AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.omidza.myapplication" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".MainActivity"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/mywidget"></meta-data> </receiver> </application> </manifest>
  10. نگارش 1.0.0

    51 دانلود

    یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا.

    رایگان

  11. مشاهده فایل کتابخانه Curved-Fab-Reveal یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا. ارسال کننده Omid Zakeri ارسال ۱۷/۰۹/۲۰ دسته کتابخانه های اندروید  
  12. یکی از عواملی که باعث جلب توجه کاربران به برنامه ای می شود استفاده از انیمیشن های جذاب و چشمگیر است. استفاده از انیمیشن در اندروید به برنامه ها شکل و شمایل حرفه ای می دهد و یکی از فاکتورهای اصلی و مهم در طراحی برنامه هایی با رابط کاربری قوی و یا باصطلاح کاربر پسند (User friendly) استفاده از انیمشین در برنامه های اندرویدی است.کتابخانه Curved-Fab-Reveal یکی از کتابخانه های جذاب به صورت انیمیشن و متریال بسیار زیبا. Curved-Fab-Reveal-Example-master.zip
  13. نگارش 1.0.0

    16 دانلود

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

    رایگان

  14. مشاهده فایل معرفی کتابخانه ShowcaseView کتابخانه (ShowcaseView ) برای برجسته سازی و نمایش بخش های خاص برنامه ها به کاربر با پوشش متمایز و جذاب طراحی شده است. این کتابخانه عالی است برای اشاره به نقاط مورد علاقه برای کاربران، حرکات، و یا موارد مبهم مفید است. ارسال کننده Omid Zakeri ارسال ۱۷/۰۹/۱۸ دسته کتابخانه های اندروید  
  15. متد سازنده ، متدی است هم نام کلاس که در هربار ايجاد نمونه‌اي جديد از آن كلاس، بصورت خودكار فراخواني مي‌گردد.هدف از متد سازنده مقدار دهی کردن اعضای کلاس در زمان ایجاد نمونه ای جدید از کلاس است. متد سازنده همیشه دارای سطح دسترسی public است. متد سازنده هیچ مقداری باز نمی گرداند حتی void هم نیست.اگر کلاسی متد سازنده نداشته باشد جاوا به صورت پیش فرض یک متد سازنده برای آن در نظر می گیرد. استفاده کردن از متد سازنده اجباری نیست.یک کلاس می تواند دارای چندین متد سازنده باشد. مثال1 : class Box { double width; double height; double depth; // This is the constructor for Box. Box() { System.out.println("Constructing Box"); width = 10; height = 10; depth = 10; } double volume() { return width * height * depth; } } class BoxDemo6 { public static void main(String args[]) { Box mybox1 = new Box(); Box mybox2 = new Box(); double vol; vol = mybox1.volume(); System.out.println("Volume is " + vol); vol = mybox2.volume(); System.out.println("Volume is " + vol); } } Output Constructing Box Constructing Box Volume is 1000.0 :مثال ۲ class Box { double width; double height; double depth; // This is the constructor for Box. Box(double w, double h, double d) { width = w; height = h; depth = d; } double volume() { return width * height * depth; } } class BoxDemo7 { public static void main(String args[]) { Box mybox1 = new Box(10, 20, 15); Box mybox2 = new Box(3, 6, 9); double vol; vol = mybox1.volume(); System.out.println("Volume is " + vol); vol = mybox2.volume(); System.out.println("Volume is " + vol); } } Output Volume is 3000.0 Volume is 162.0