tellfa

توسعه دهنده اندروید
  • تعداد ارسال ها

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

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

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

6 Neutral

1 دنبال کننده

درباره tellfa

  • درجه
    توسعه دهنده حرفه ای
  1. میدونی کلونی یعنی چی؟! کلونی یعنی محل تجمع، یعنی جایی که همه دور هم جمع میشن و کاری انجام میدن. میدونی که دیگه کم کم جستجو بین هزاران سایت داره منقضی و خسته کننده میشه؟! تااااااازه اگه توی هزارتا سایت بتونی مطلبی که میخواستی رو پیدا کنی مگه تبلیغات میزارن که کمی مطلبت رو بخونی ؟! دیگه نگران نباش. اپلیکیشن کلونی برای برطرف کردن این مشکلات ساخته شده. توی این برنامه میتونی تمامی خواسته هات رو برطرف کنی. اهل ورزشی؟ ماشین و موتور چی؟ به زیبایی و سلامت خودت اهمیت میدی؟ به غذاهایی که میخوری چطور؟ اوقات بیکاری چیکار میکنی؟ میدونی اگه بخوای هرکدوم از این موارد رو نگاه کنی و لذت ببری چقدر زمان نیاز داری تا بتونی واسه هر کدوم یک سایت یا یک اپلیکیشن مناسب پیدا کنی... چرا خودت رو اذیت میکنی؟ چرا حافظه موبایلت رو پر میکنی؟ چرا حجم اینترنتت رو بیخودی مصرف میکنی؟ بیا کلونی رو نصب کن و خودت رو راحت کن. بجای اینکه 100 تا سایت رو بگردی، کلونی رو 1بار بگرد ... --------------------------- ویژگی های کلونی : - بروزرسانی روزانه و مستمر - مصرف فوق العاده کم از حجم اینترنت - مصرف کم باتری و رم گوشی - رابط کاربری شیک و زیبا و ... ------------------------- دیگه زیاد توضیح نمیدم، خودت نصب کن تا متوجه شی لینک دانلود : https://cafebazaar.ir/developers/panel/apps/com.tellfa.colony/info/?l=fa ممنون میشم نصب کنید و در بازار نظر بدید
  2. با سلام با لینک زیر مراجعه کنید : http://mobpay.ir/ قابلیت ها: - ایجاد اکانت با مشخصات واقعی شما در ایران - قابلیت انتشار برنامه به صورت پولی، رایگان و پرداخت درون برنامه (فعال سازی کامل مرچند) - صدور کارت فیزیکی موفق باشید
  3. سلام داداش ببخشید بی جا میپرسم من از این کتابخونه استفاده میکنم ولی وقتی متنای فارسی میفرستم دیتابیس ذخیره بشه به صورت ??? ذخیره میشه شما راه حلی داری برای این مشکل؟ موقع ارسال به UTF-8 تبدیل کنید بعد ارسال کنید
  4. با سلامیک نمونه کامل سورس برای پیاده سازی مورد درخواستی شما.هرجای سورس نکته / ابهامی داشت بفرمایید تا بیشتر راهنمایی کنیم.ساختار دیتابیس : CREATE TABLE password_reset_request (sno int(11) NOT NULL AUTO_INCREMENT,email varchar(50) NOT NULL,encrypted_temp_password varchar(256) NOT NULL,salt varchar(10) NOT NULL,created_at datetime DEFAULT NULL,PRIMARY KEY (sno)) کدهای مربوط به Operation دیتابیس :در این کد موارد مانند امنیت پسور هم لحاض شده شده و Encrypt میشود. <?php class DBOperations{ public function passwordResetRequest($email){ $random_string = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 6)), 0, 6); $hash = $this->getHash($random_string); $encrypted_temp_password = $hash["encrypted"]; $salt = $hash["salt"]; $sql = 'SELECT COUNT(*) from password_reset_request WHERE email =:email'; $query = $this -> conn -> prepare($sql); $query -> execute(array('email' => $email)); if($query){ $row_count = $query -> fetchColumn(); if ($row_count == 0){ $insert_sql = 'INSERT INTO password_reset_request SET email =:email,encrypted_temp_password =:encrypted_temp_password, salt =alt,created_at = :created_at'; $insert_query = $this ->conn ->prepare($insert_sql); $insert_query->execute(array(':email' => $email, ':encrypted_temp_password' => $encrypted_temp_password, 'alt' => $salt, ':created_at' => date("Y-m-d H:i"))); if ($insert_query) { $user["email"] = $email; $user["temp_password"] = $random_string; return $user; } else { return false; } } else { $update_sql = 'UPDATE password_reset_request SET email =:email,encrypted_temp_password =:encrypted_temp_password, salt =alt,created_at = :created_at'; $update_query = $this -> conn -> prepare($update_sql); $update_query -> execute(array(':email' => $email, ':encrypted_temp_password' => $encrypted_temp_password, 'alt' => $salt, ':created_at' => date("Y-m-d H:i"))); if ($update_query) { $user["email"] = $email; $user["temp_password"] = $random_string; return $user; } else { return false; } } } else { return false; } } public function resetPassword($email,$code,$password){ $sql = 'SELECT * FROM password_reset_request WHERE email = :email'; $query = $this -> conn -> prepare($sql); $query -> execute(array(':email' => $email)); $data = $query -> fetchObject(); $salt = $data -> salt; $db_encrypted_temp_password = $data -> encrypted_temp_password; if ($this -> verifyHash($code.$salt,$db_encrypted_temp_password) ) { $old = new DateTime($data -> created_at); $now = new DateTime(date("Y-m-d H:i")); $diff = $now->getTimestamp() - $old->getTimestamp(); if($diff < 120) { return $this -> changePassword($email, $password); } else { false; } } else { return false; } }} کدهای مربوط به عملیات یا Functions : <?php require_once 'DBOperations.php';require 'PHPMailer/PHPMailerAutoload.php'; class Functions{ private $db; private $mail; public function __construct() { $this -> db = new DBOperations(); $this -> mail = new PHPMailer; } public function resetPasswordRequest($email){ $db = $this -> db; if ($db -> checkUserExist($email)) { $result = $db -> passwordResetRequest($email); if(!$result){ $response["result"] = "failure"; $response["message"] = "Reset Password Failure"; return json_encode($response); } else { $mail_result = $this -> sendEmail($result["email"],$result["temp_password"]); if($mail_result){ $response["result"] = "success"; $response["message"] = "Check your mail for reset password code."; return json_encode($response); } else { $response["result"] = "failure"; $response["message"] = "Reset Password Failure"; return json_encode($response); } } } else { $response["result"] = "failure"; $response["message"] = "Email does not exist"; return json_encode($response); } } public function resetPassword($email,$code,$password){ $db = $this -> db; if ($db -> checkUserExist($email)) { $result = $db -> resetPassword($email,$code,$password); if(!$result){ $response["result"] = "failure"; $response["message"] = "Reset Password Failure"; return json_encode($response); } else { $response["result"] = "success"; $response["message"] = "Password Changed Successfully"; return json_encode($response); } } else { $response["result"] = "failure"; $response["message"] = "Email does not exist"; return json_encode($response); } } public function sendEmail($email,$temp_password){ $mail = $this -> mail; $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'your.email@gmail.com'; $mail->Password = 'password'; $mail->SMTPSecure = 'ssl'; $mail->Port = 465; $mail->From = 'your.email@gmail.com'; $mail->FromName = 'Your Name'; $mail->addAddress($email, 'Your Name'); $mail->addReplyTo('your.email@gmail.com', 'Your Name'); $mail->WordWrap = 50; $mail->isHTML(true); $mail->Subject = 'Password Reset Request'; $mail->Body = 'Hi, Your password reset code is '.$temp_password.' . This code expires in 120 seconds. Enter this code within 120 seconds to reset your password. Thanks, Learn2Crack.'; if(!$mail->send()) { return $mail->ErrorInfo; } else { return true; } } public function sendPHPMail($email,$temp_password){ $subject = 'Password Reset Request'; $message = 'Hi,nn Your password reset code is '.$temp_password.' . This code expires in 120 seconds. Enter this code within 120 seconds to reset your password.nnThanks,nLearn2Crack.'; $from = "your.email@example.com"; $headers = "From:" . $from; return mail($email,$subject,$message,$headers); }} کد دسترسی یا index : if ($operation == 'resPassReq') { if(isset($data -> user) && !empty($data -> user) &&isset($data -> user -> email)){ $user = $data -> user;$email = $user -> email; echo $fun -> resetPasswordRequest($email); } else { echo $fun -> getMsgInvalidParam(); }}else if ($operation == 'resPass') { if(isset($data -> user) && !empty($data -> user) && isset($data -> user -> email) && isset($data -> user -> password)&& isset($data -> user -> code)){ $user = $data -> user;$email = $user -> email;$code = $user -> code;$password = $user -> password; echo $fun -> resetPassword($email,$code,$password); } else { echo $fun -> getMsgInvalidParam(); } تیکه کدهای بالا سمت سرور میباشند!و اما کدهای مربوط به کلاینت : کدهای مربوط به رابط کاربری برنامه یا XML : <?xml version="1.0" encoding="utf-8"?> کدهای جاوا که قالب Fragment پیدا سازی شده اند : import android.app.Fragment;import android.app.FragmentTransaction;import android.os.Bundle;import android.os.CountDownTimer;import android.support.design.widget.Snackbar;import android.support.v7.widget.AppCompatButton;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView; import com.learn2crack.loginregistration.models.ServerRequest;import com.learn2crack.loginregistration.models.ServerResponse;import com.learn2crack.loginregistration.models.User; import retrofit2.Call;import retrofit2.Callback;import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory; public class ResetPasswordFragment extends Fragment implements View.OnClickListener{ private AppCompatButton btn_reset; private EditText et_email,et_code,et_password; private TextView tv_timer; private ProgressBar progress; private boolean isResetInitiated = false; private String email; private CountDownTimer countDownTimer; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_password_reset,container,false); initViews(view); return view; } private void initViews(View view){ btn_reset = (AppCompatButton)view.findViewById(R.id.btn_reset); tv_timer = (TextView)view.findViewById(R.id.timer); et_code = (EditText)view.findViewById(R.id.et_code); et_email = (EditText)view.findViewById(R.id.et_email); et_password = (EditText)view.findViewById(R.id.et_password); et_password.setVisibility(View.GONE); et_code.setVisibility(View.GONE); tv_timer.setVisibility(View.GONE); btn_reset.setOnClickListener(this); progress = (ProgressBar)view.findViewById(R.id.progress); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_reset: if(!isResetInitiated) { email = et_email.getText().toString(); if (!email.isEmpty()) { progress.setVisibility(View.VISIBLE); initiateResetPasswordProcess(email); } else { Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show(); } } else { String code = et_code.getText().toString(); String password = et_password.getText().toString(); if(!code.isEmpty() && !password.isEmpty()){ finishResetPasswordProcess(email,code,password); } else { Snackbar.make(getView(), "Fields are empty !", Snackbar.LENGTH_LONG).show(); } } break; } } private void initiateResetPasswordProcess(String email){ Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); RequestInterface requestInterface = retrofit.create(RequestInterface.class); User user = new User(); user.setEmail(email); ServerRequest request = new ServerRequest(); request.setOperation(Constants.RESET_PASSWORD_INITIATE); request.setUser(user); Call response = requestInterface.operation(request); response.enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { ServerResponse resp = response.body(); Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); if(resp.getResult().equals(Constants.SUCCESS)){ Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); et_email.setVisibility(View.GONE); et_code.setVisibility(View.VISIBLE); et_password.setVisibility(View.VISIBLE); tv_timer.setVisibility(View.VISIBLE); btn_reset.setText("Change Password"); isResetInitiated = true; startCountdownTimer(); } else { Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); } progress.setVisibility(View.INVISIBLE); } @Override public void onFailure(Call call, Throwable t) { progress.setVisibility(View.INVISIBLE); Log.d(Constants.TAG,"failed"); Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); } }); } private void finishResetPasswordProcess(String email,String code, String password){ Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constants.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); RequestInterface requestInterface = retrofit.create(RequestInterface.class); User user = new User(); user.setEmail(email); user.setCode(code); user.setPassword(password); ServerRequest request = new ServerRequest(); request.setOperation(Constants.RESET_PASSWORD_FINISH); request.setUser(user); Call response = requestInterface.operation(request); response.enqueue(new Callback() { @Override public void onResponse(Call call, retrofit2.Response response) { ServerResponse resp = response.body(); Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); if(resp.getResult().equals(Constants.SUCCESS)){ Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); countDownTimer.cancel(); isResetInitiated = false; goToLogin(); } else { Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show(); } progress.setVisibility(View.INVISIBLE); } @Override public void onFailure(Call call, Throwable t) { progress.setVisibility(View.INVISIBLE); Log.d(Constants.TAG,"failed"); Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show(); } }); } private void startCountdownTimer(){ countDownTimer = new CountDownTimer(120000, 1000) { public void onTick(long millisUntilFinished) { tv_timer.setText("Time remaining : " + millisUntilFinished / 1000); } public void onFinish() { Snackbar.make(getView(), "Time Out ! Request again to reset password.", Snackbar.LENGTH_LONG).show(); goToLogin(); } }.start(); } private void goToLogin(){ Fragment login = new LoginFragment(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.replace(R.id.fragment_frame,login); ft.commit(); }} کد رو بررسی کنید اگر سوالی / مشکلی داشتید مطرح کنید تا راهنماییتان کنم.توجه داشته باشید که اگر قصد راهنمایی کامل بخواین صورت نمیگیره چرا که اول باید خودتون بررسی کنید، فقط تیکه کدی رو که اشکال دارید مطرح کنید.درضمن یادمه دوستانی در مورد retrofit سوالاتی رو میپرسیدن، این سورس کد برپایه Retrofit میباشد. پس سورس کد خوبی هم برای اون دسته از دوستان میتونه باشهامیدوارم که به دردتون بخوره.موفق باشید
  5. سلام روش های متعددی برای اینکار وجود داره. - 1) تغییر در فایل manifest - 2) تغییر در فایل جاوا (اکتیویتی / فرگمنت) - 3) تغییر در فایل layout تقریبا فرق خاصی نداره که شما از کدوم یک از این روش ها استفاده کنید، ولی یکی از متداول ترین روش ها اینه که شما focus لایتون رو تغییر دهید. برای مثال این کد زیر را به لایه روت خود اضافه کنید : android:focusable="true" مثال : android:id="@+id/login_headerLayout" android:layout_width="match_parent" android:layout_height="130dp" android:background="@drawable/gradient_mauve_color_radius" android:focusable="true" android:padding="10dp">
  6. دوست عزیز میتونید ایده خودتون رو ثبت کنید. دیوار ایده نبوده میلاد جان، دیوار و امثال اینا کپی محض بودن! ایده و پتنت رو هم میشه دور زد، چطور که در دنیا روزانه هزاران بار دارن دور میزنن، اونایی هم که میبینید میان شکایت میکنن به خاطر اینه که میان صرفا کپی میکنن پتنت یا ایده رو هیچ تغییری نمیدن. و الا اگر شما کمی تغییر بدین دیگر انحصاری نیست و میشه برای شما! مثل حسگر اثر انگشت که تمامی برند های گوشی ساز دنیا دیگه کاملا زدنش برای ثبت کردنش میتونید هم در داخل اقدام کنید هم در خارج. هزینه خارج از کشور ان تا جایی که یادمه 1.000$ بود و در ایران هم 800 تومان. دیگه نمی دونم قیمتش تغییر کرده یا خیر. حتی میتونید طرح اپلیکیشن، نام و ... رو هم در ایران به ثبت برسونید. سال پیش بنده یکی از برنامه های تیممون رو (شبکه اجتماعی) رو ثبت کردم. البته باید شرکت باشید و مراحل اداری زیاد و مسخره ای داره! دنبالش بیافتید متوجه میشید موفق باشید
  7. سعی کنید کلا امکان چت (گفتگو) رو حذف کنید و الا برنامه تون شکست میخوره! در ایران برای برنامه های چت و شبکه اجتماعی باید دسترسی به دولت بدین و کسی دیگه سمتش نمیاد، از طرفی برای گرفتن مجوز از سمت ارشاد با عنون "نرم افزار های کاربر محور" به کلی دردسر خواهید خورد و باید 3-4ماهی رو صبر کنید برای دریافت مجوز! به هرحال اگر خواستین استفاده کنید میتونید از Socket Programming و یا Jaber استفاده کنید. توصیه میکنم از Jaber استفاده کنید، هم مطمئن تره و هم شرکت های بزرگ ازش استفاده میکنن موفق باشید
  8. اگر ایده و برنامه تون (پیاده سازی) خوب باشه، بله درآمد خوبی داره موفق باشید
  9. من 3 سالی هست که از ایران سرور هم هاست دارم و هم سرور اختصاصی، توی این 3 سال هم شاید 2 یا 3 بار Down شده اونم کمتر از 5 دقیقه که خب توی 3 سال کاملا طبیعی هست! اگر از نظر مالی مشکلی نداشته باشید و بتونید سرور مجازی (VPS) تهیه کنید خیلی خوبه خیال خودتون هم راحت میشه!
  10. این کد رو در تگ Application موجود در AndroidManifest اضافه کنید : android:largeHeap="true" این تکه کد باعث میشه حافضه بیشتر به برنامه شما اختصاص داده بشه. در ضمن سعی کنید از کامپوننت های جدید نظیر AppCompat و RecyclerView به ویژه اندروید استدیو استفاده کنید موفق باشید
  11. سلام، خیر حتما نباید به جیمیل وصل باشن! در اندروید 4.0 به پایین باید حتما به جیمیل وصل باشن و در اندروید 4.0 به بالا باید Google.services در گوشی وجود داشته باشه که طبق آمار گوگل 99.5% گوشی ها این سرویس رو روی گوشی هاشون دارن. بده در اندروید 4.0 به بالا بارها و بارها به دستگاه هایی پوش ارسال کردم که اصلا Gmail در گوشی اونا فعال نبود. البته من مستقیم از GCM استفاده کردم و از واسط ها استفاده نکردم. فقط از پوشه برای تست استفاده کردم که اوکی بود GCM مخفف Google Cloud Messaging میباشد که اکثر سرویس دهنده ها از آن استفاده میکنند.
  12. در این صورت سرور مورد نظر میترکه! مگر اینکه یک سرور کامل قوی باشه که ماهانه چند میلیون پولشه! اگر بخواین در هر لحظه چک کنید یعنی مدام درخواست بره سمت سرور و شما در نظر بگیرین اگر 100.000 تا کاربر داشته باشین اونوقت دیگه باید قید سرور رو بزنید! مگر اینکه تنظیم کنید هر چند دقیقه یعنی هز 1 ساعت یکبار چک کنه که خوب این هم زیاد جالب نیست چون با تاخیر 1ساعت میرسه درست کاربر! برای رفع همین مشکل سرویسی به نام GCM توسط گوگل ساخته شد که بیشتر این سرویس های نوتیفیکیشن ها هم از همین سرویس استفاده میکنند! بهتره مستقیم از GCM استفاده کنید و یا اگر نتونستید از Pushe هم میتونید استفاده کنید. کارکرد و ساختارش خیلی سادس (البته اینم برپایه GCM هست) موفق باشید
  13. دوست عزیز منظور بنده از اصولی دقیقا رفع مشکل همین بود، در پروژه شما از کتابخانه های AppCompat که مربوط میشه به 'com.android.support:design:23.2.1' استفاده شده (برخی از قسمت های این کتابخانه ا در نسخه های جدید Android Studio و Intellij به طور خودکار وارد پروژه میشن) و شما از ActionBar استفاده کردین، اکشن بار برای نمایش نیاز به یکسری از Style های ویژه داشت که این استایل ها در 'com.android.support:design:23.2.1' تغییر پیدا کردن شما باید در کدهای style.xml با توجه به نوع پروژه و مواردی که استفاده کردین به Activity و ActionBar استایل مخصوص به خودش رو در نظر بگیرین و بنویسید! همانطور که در تصاویر هم مشخصه تمامی ارور ها مربوط به کدهای استایل و فراخوانی انها در AndroidManifest هست! باز هم میگم سعی کنید از Toolbar استفاده کنید تا هم کارتون حرفه ای باشه و هم راحتتر بتونید انجام بدین موفق باشید
  14. اکشن بار 1 سال و نیم هست که دیگه منسوخ شده دوست عزیز! میتونید از تولبار استفاده کنید، تولبار امکاناتی به مراتب بیشتر و بهتر از اکشن بار دارد و بسیار منعطف میباشد. لینک آموزش تولبار (انگلیسی) : http://www.android4devs.com/2014/12/how-to-make-material-design-app.html سعی کنید برنامه نویسی رو اصولی یاد بگیرین و از متد ها روز استفاده کنید
  15. این قابلیت از اندروید 5.0 به بعد اضافه شده است، برخی از توسعه دهنده های چینی تونستن این قابلیت رو وری اندروید 4.4 هم بیارن ولی بعضا با مشکلاتی روبرو میشین اعم از مصرف بیهوده رم، هنگیِ یهوایه برنامه و ... کلا توصیه نمیشه که این کار رو بکنید ولی اگر مایل بودین میتونم لینک کتابخونش رو بدم