آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

تغییرات API در ورژن های مختلف Android

کاشی زاده  7 سال پیش  7 سال پیش
+85 0

دوستان سلام،
همه این موضوع رو میدونیم که هر وقت نسخه جدیدی از سیستم عامل اندروید ارائه میشه ، برخی از بخش های API دپریکیت میشه و جایگزینی برای اون معرفی میشه.
این جایگزینی API مثل این میمونه که شما گوشی خریدی که از نسخه 2.0 بلوتوث پشتیبانی میکنه ، سال بعد نسخه جدید بلوتوث ارائه میشه که ورژن 3.0 هست .
گوشی شما هنوز امکان استفاده از بلوتوث رو داره ولی مثلا در نسخه 3.0 سرعت بیشتری نسبت به نسخه قبلی برای انتقال داده وجود داره .


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


ممنون

+2 0
مهندس این خیلی خوبه اگر میشه پست ثابتش کنید (7 سال پیش)
+4 0
سلام. خسته نباشید. واقعا لازم بود. (7 سال پیش)
+2 0
سلام من با eclipse و sdk نسخه ای که استاد معرفی کردن کار میکنم میخواستم از لایبرری android-support-design j تو پروژه هام استفاده کنم اما API نسخه ی 24رو میخواد و وقتی API های نسخه های مختلف مثل 21 22 23 24 رو داخل platforms میریزم کار نمیکنن حتی وقتی بابهاشون پروژه ی جدید هم میسازم ارور R cannot not be Resolved رو میده اما api های زیر 21 یعنی 20, 19, 18,.... اینطور نیستن مشکل از کجاس؟ (7 سال پیش)
+1 0
سلام ، یا باید نسخه جدید Eclipse رو بهمراه SDK جدید دانلود کنید یا Android Studio جدید بریزید . (7 سال پیش)
+1 0
یعنی با اکلیپس اقای نور حسینی هم نمیشه و اینکه لازم نیس جاوا نسخه ی 7 یا 8 رو نصب کنم؟ و اینکه روی یک سیستم که تازه روش ویندوز نصب شده چطور میشه نسخه ی جدید اکلیپس و SDK جدید رو نصب کرد؟ منظورم اینکه نکته ی خاصی نداره ؟ یا اینکه کدوم نسخه از اکلیپس با کدوم نسخه از SDK سازگاری داره؟ (7 سال پیش)
+2 0
از اینجا لینک میتونید آخرین نسخه Eclipse را دانلود کنید و SDK ، JDK جدید را نیز باید جداگانه دریافت نمایید . (7 سال پیش)
+1 0
به جای استفاده از stop و resume در Thread که منسوخ شدن از چی استفاده کنیم ؟ (7 سال پیش)
+2 0
این مسئله مربوط به جاوا هست و چندین سال هست (حداقل 8 سال پیش) که دپریکت شده . به جای این ها باید از دستورات شرطی استفاده کنید . (7 سال پیش)
0 0
برا متوقف کردنش میشه کاری کرد ولی برای ادامه دادنش نمیشه کاری کرد ! یه سر به این تاپیک بزنید لینک (7 سال پیش)
0 0
آقا یه چپیز عجیب هم نظرهای من از این پست حذف شده هم پاسخی که برای ویو پیجر خودم گذاشتم (7 سال پیش)
+1 0
پاسخی که شما قرار داده بودید در این قسمت من حذف کردم ، چون دقیقا 2 پاسخ پایین تر قبلا توسط دوستان مطرح شده بود . (7 سال پیش)
0 0
دو پاسخ بالاتر بود محمدحسین جان :) (7 سال پیش)
+1 0
بله درسته ببخشید من ندیدم (7 سال پیش)
0 0
درست و بجا بود (7 سال پیش)
 برای این سوال 9 پاسخ وجود دارد.
پاسخ به سوال 
کاشی زاده  7 سال پیش
+21 0

HttpClient یکی از Interface های مربوط به پکیج Apache هست که در نسخه 4.3 این پکیج دپریکیت شده .
در API جدید اندروید (API 22) که توسط گوگل ارائه شده از نسخه جدید Apache استفاده شده و به همین دلیل HttpClient به عنوان یک API دپریکیت شده معرفی میشه .
کاربرد HttpClient در اجرای درخواست ها بر روی پروتکل HTTP است .

راه حل های جایگزین :

راه حل اول : طبق توضیحاتی که در سایت Apache (منبع) ارائه شده، توصیه شده از کلاس HttpClientBuilder استفاده شود .
برای استفاده از این کلاس در این لینک مثال هایی زده شده .
اما با جستجو در انجمن میتونید سوالات و راه حل های مختلفی که ارائه شده رو ببنید که در زیر اشاره میکنم .


راه حل دوم : با اضافه کردن نیازمندی زیر به پروژه از طریق Gradle میتونید بدون مشکل دوباره از HttpClient استفاده کنید و طبق روشی که در آموزش ها گفته شده به کارتون ادامه بدید .

 dependencies {
  compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'}

راه حل سوم : استفاده از URLConnection ، این راه حل جایگزنی برای HttpClient هست که یکی از دوستان در این تاپیک توضیحات لازم رو داده ، پس دیگه اینجا توضیحات اضافی رو نمی نویسم .


راه حل چهارم : با یه جستجوی ساده در Stackoverflow به این روش هم میرسید که از کتابخانه Legacy استفاده کنید، با این کار امکان استفاده از HttpClient میسر میشه .

 android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"
    useLibrary 'org.apache.http.legacy'
}
0 0
با اانجام این موارد باز هم روی HttpResponse گیر داره . البته با 24 نه 23 (7 سال پیش)
+3 0
روی API 24 تست نکردم ، وقتی هنوز این API به صورت رسمی روی گوشی ها ارائه نشده لزومی به استفاده از اون نیست حتی اگر ارائه بشه هم باز لزومی به استفاده از اون نیست ، به جای اینکه زمانتون رو بذارید برای ایجاد مشکل تمرکزتون رو روی امکانات اپ بزارید تغییر API به ورژن های جدید تر سودمندی زیادی برای شما نخواهد داشت . (7 سال پیش)
0 0
چرا از والی استفاده نشه؟ (7 سال پیش)
+1 0
میتونید از کتابخانه های مختلف استفاده کنید این تاپیک فقط برای رفع مشکلات مربوط به API اندروید هست . (7 سال پیش)
0 0
با توجه به اینکه این روش ها اجرایی هست به نظر شما برای ارتباط با سرور کدوم روش توصیه میشه ؟ شماره 1 یا 2 یا 3 یا 4 یا استفاده از کتابخانه های موجود؟ (7 سال پیش)
پاسخ به سوال 
behnam2000  7 سال پیش
+19 0

viewPager.setOnPageChangeListener
نیز هم اکنون deprecate شده در عوض می توانیم از viewPager.addOnPageChangeListener استفاده کنیم:

قبلی:

 viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {                                                        

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {              

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });

هم اکنون:

 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
پاسخ به سوال 
کاشی زاده  7 سال پیش
+23 0

در این قسمت روش ساخت API Key برای نقشه Google را که کمی تغییر کرده بررسی میکنیم .
این تغییرات به قدری نیست که کسی دچار مشکل بشه ، اما به خاطر این چند نفر از دوستان در این مرحله دچار مشکل شدند این موضوع را مطرح کردم .

1- به این آدرس برید تا وارد پنل مربوط به ساخت API Key شویم .https://developers.google.com/maps
   اگر این صفحه برای شما محدود شده بود و خطای عدم دسترسی (403) را دیدید ، باید IP خود را به IP غیر ایرانی تغییر دهید .2- بر روی گزینه مشخص شده کلیک کنید .
3- روی دکمه GET A KEY کلیک کنید .
4- در پنجره باز شده روی CONTINUE کلیک کنید .
5- در صفحه جدید تنظیمات را روی Create a project قرار دهید و روی Continue کلیک کنید .
6- در صفحه جدید اطلاعات مورد نیاز را با ترتیب شماره گذاری وارد کنید .
    1 : نام انتخابی برای کلید جدید
    2 : نام پکیج را در فیلد شماره 2 وارد کنید .
    3 : امضاء پکیج را در فیلد شماره 3 وارد کنید .
برای دریافت امضاء پکیج طبق آموزش ها عمل کنید .
7- در نهایت کلید جدید برای شما ساخته شده و میتوانید از در پروژه استفاده کنید .



موفق باشید

0 0
آفرین مهندس خسته نباشی واقعا ممنون (7 سال پیش)
0 0
کسی نمیتومه منو راهنمایی کنه من تمام مراحل برای مسیریابی روی نقشه را رفتم ولی الان به من پیغام update میده در ضورتی که google play service ورژن 32 هست داخل sdk manager هم که میرم تمام گزینه ها تیک خورده و نصب شده دیگه باید چه کاری انجام بدم ؟ (7 سال پیش)
پاسخ به سوال 
Criss  7 سال پیش
+8 0

منقضی شدن  EncodingUtils  و HTTP

org.apache.http.protocol.HTTP
org.apache.http.util.EncodingUtils

قبل از هر چیز معذرت خواهی میکنم که این پست رو نیمه تموم رها میکنم (سر فرصت بر میگردم و توضیحات و اطلاعات بیشتر رو قرار میدم ، فعلا راه حلی که موقتا استفاده کردم رو میگم و هنوز از عواقب استفاده از این روش اطلاعی ندارم ، ظاهرا Apache کلی تغییرات داشته ! )

مثال : برای ارسال مقادیر بصورت POST در WebVIew نیاز به استفاده از کلاس EncodingUtils دارید و در خود کلاس EncodingUtils  نیز کلاس HTTP لازم هست

  webView.postUrl(url, EncodingUtils.getBytes(postData, "UTF-8"));

برای حل مشکل بصورت موقتی کافیه کلاس های اونهارو دستی بصورت دستی به پروژه اضافه کنید و کدهاشون رو از منابع زیر کپی کنید :

HTTP.java (Link)

EncodingUtils.java (Link)

میتونید خیلی راحت کلاس رو از پکیج خودتون Import کنید و میبینید که برنامه بخوبی کار میکنه :

 import classHelper.EncodingUtils;

در حال ویرایش . . .

 

0 0
انقدر مطلب جدید نمی ذارید که همین هایی هم که آموزش دادید دپریکیت شدن (7 سال پیش)
0 0
انقدر مطلب جدید نمی ذارید که همین هایی هم که آموزش دادید دپریکیت شدن (7 سال پیش)
+1 0
قرار نیست اینجا مطلب جدید قرار داده بشه ، هر زمان که کسی مشکلی داشته باشد مطرح میکنه و دوستان بعد از بررسی به دنبال پیدا کردن راه حل های جایگزین میگردند . (7 سال پیش)
0 0
خدا رو شکر کسی مشکلی نداره!!!! (7 سال پیش)
پاسخ به سوال 
هادی اکبرزاده  7 سال پیش
+1 0

سلام کلاس FloatMath دپرکت شده جایگزینش چیه؟ البته من متد FloatMath.ceil رو نیاز دارم ...

0 0
public static float ceil(float value) { return (float) Math.ceil(value); } very straightforward to fix. (7 سال پیش)
پاسخ به سوال 
هادی اکبرزاده  7 سال پیش
+3 0

متد getColor کلاس Resources در API 23 به بعد دپرکت شده که می تونیم از متد زیر استفاده کنیم

 public static final int getColor(Context context, int id) {
        if (Build.VERSION.SDK_INT>= 23) {
            return ContextCompatApi23.getColor(context, id);
        } else {
            return context.getResources().getColor(id);
        }
    }

کلاس ContextCompact از android support v4 نسخه 23 هس

پاسخ به سوال 
احسان  7 سال پیش
+1 0

سلام BasiNameValuePair که در پروژه Notes استفاده شده هم دپریکیت شده لطفا راهنمایی کنید برای جایگزینش 

ممنون

+1 0
از ContentValues میتونید استفاده کنید . لینک (7 سال پیش)
پاسخ به سوال 
امید  7 سال پیش
+7 0

دیپریکیت شدن کلاس Plus و روش جایگزینیش
یکی از کاربرد های این کلاس در قسمت Sign in شدن توسط اکانت +Google بودش (که البته همچنان هم میشه ازش استفاده کرد و چیز خاصی نیست، ولی چون من یکم وسواسیم با چیز دیگه ای جایگزینش کردم)

روش دریافت API Key برای Sign in شدن توسط +Google

1- اول از همه مطمعن بشید که مرورگری که ازش استفاده میکنید به اکانت Gmail شما وصل باشه و بعد وارد سایت https://console.developers.google.com بشید. (اگر نتونستید به این سایت برید حتما از ابزار های تغییر IP استفاده کنید)
2- طبق عکس زیر روی Create Project کلیک کنید و یک پروژه جدید بسازید.(ممکن ساختش چند ثانیه طول بکشه، صبور باشد)

3- بعد از ساخت پروژه صفحه به قسمت انتخاب API ها میره، اگر به صورت خودکار این اتفاق نیفتاد روی Library کلیک کنید و بعد Google+ API رو انتخاب کنید. (مطابق عکس زیر)

4-در این مرحله API رو روشن کنید.

5-حالا به این آدرس برید و روی App Name کلیک کنید و از لیست باز شده پروژتون رو انتخاب کنید و اسم پکیجتون رو هم در قسمت Android Pachage Name وارد کنید (برای جلوگیری از اشتباه اسم پکیجتون رو از داخل Manifests کپی کنید) و در آخر روی گزینه Choose and configure Services که به رنگ آبی در اومده کلیک کنید.

6- خوب در این قسمت نیاز به کدی به اسم SHA-1 داریم که روش دریافتش به شرح زیره:
داخل ترمینال یا همون CMD خط زیر رو وارد کنید:
keytool -exportcert -keystore C:\Users\Omid\.android\debug.keystore -list -v
در قسمت password هم تایپ کنید : android
نکته 1: اگر به صورت دستی آدرس فولدر android. رو به هر روشی تغییر دادید، در خط بالا آدرس صحیحش رو وارد کنید.(آدرس پیشفرض همان خط بالاست)
نکته 2: این SHA-1 فقط برای نسخه Debug است و برای نسخه Releas خودتون سرچ کنید و پیداش کنید(بخوام بزارم دیگه خیلی طولانی میشه)
اگر همه چیز خوب پیش بره با عکس زیر مواجه میشید:

7- بعد از کپی کردن SHA-1 اون رو در کادر مربوطه قرار بدید و بعد گزینه Enable google sign-in رو بزنید و بعد گزینه Generate configuration files رو بزنید.

8- در صفحه بعد فایلی برای دانلود قرار داده شده، روی گزینه Download Google-services.json کلیک کنید تا دانلود انجام شود.
9- فایل دانلود شده را درون پوشه پروژه خود و در پوشه app ذخیره کنید.
10- حالا وارد پروژتون در اندروید استدیو بشید و فایل build.gradle(project) رو باز کنید و خط زیر رو به قسمت dependencies اضافه کنید:

classpath 'com.google.gms:google-services:3.0.0'

11- حالا فایل build.gradle(module) رو باز کنید و خط زیر رو به آخرین خط این فایل اضافه کنید:

apply plugin: 'com.google.gms.google-services'

و در همین فایل خط زیر رو هم به قسمت dependencies اضافه کنید:

compile 'com.google.android.gms:play-services-auth:9.4.0'

12- حالا توی هر لایه ای که نیاز دارید کلید Sign in گوگل رو توسط کد زیر قرار بدید:

<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt" />

13- حالا برای Sign in شدن توسط اکانت گوگل کاربر میتونید از کد زیر استفاده کنید:

public class MainActivity extends AppCompatActivity implements
GoogleApiClient.OnConnectionFailedListener,
View.OnClickListener {

private GoogleApiClient mGoogleApiClient;
private static final int RC_SIGN_IN = 9001;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findViewById(R.id.sign_in_button).setOnClickListener(this);

initGoogle();

}

private void initGoogle() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();

mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
//.addApi(Plus.API) <<<========================>>> deprecated
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sign_in_button:
signIn();
break;
}
}

private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}
}

میتونید قسمت deprecate شده رو در کد بالا ببینید.


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

0 0
مرسی (7 سال پیش)
پاسخ به سوال 
Rabbit  7 سال پیش
+6 0

یکی از متدهایی که در api بیست و سه (23) deprecate شده getColor هست مثلا قبلا می‌گفتیم:

 textView.setTextColor(getResources().getColor(R.color.orange));

اما حالا نباید از getColor استفاده کرد. به جاش می‌تونید از عبارت زیر استفاده کنید:

 ContextCompat.getColor(context, R.color.your_color);

یعنی کدی که خط اول نوشتم باید به شکل زیر دربیاد:

  textView.setTextColor(ContextCompat.getColor(MyActivity.this,R.color.my_color));
0 0
دلیلش اینه که ContextCompat ورژهای قبلی رو ساپورت می کنه (7 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .