2016-05-10 7 views
0



Я работаю над функцией SMS для андроида, и я могу отправить местоположение и адрес пользователей через sms ограниченному числу контактов в качестве своего требования к моим приложениям, теперь я хочу реализовать Прогресс поэтому, когда пользователи нажимают кнопку отправки, должен появляться диалог выполнения и после отправки смс всем контактам диалог прогресса должен исчезнуть.

Я искал alot для этого, но это заставляло меня очень смущать, как это сделать для моего приложения, потому что я новичок в android!Прогресс Диалог для AsyncTask Реализация при отправке нескольких смс

может кто-нибудь, пожалуйста, помогите мне о том, как реализовать onPreExecute(), onPostExecute() и doInBackground() методы в моем классе, здесь я в том числе мой Java-класс для отправки смс.

package com.example.ghaznavi.myapp; 

import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.widget.Toast; 
import android.content.IntentFilter; 


public class SmsHandler{ 

    Settings setObj=new Settings(); 
    double latitude,longitude; 

    public SmsHandler() { 
    } 

    public void SendSms(final Context hcontext) 
    { 
     GPSService mGPSService = new GPSService(hcontext); 
     LocationAddress locObj=new LocationAddress(); 
     mGPSService.getLocation(); 

     latitude = mGPSService.getLatitude(); 
     longitude = mGPSService.getLongitude(); 

     StringBuilder sb = new StringBuilder(160); 
     String addd= locObj.getAddressFromLocation(latitude,longitude,hcontext); 

     sb.append("Hi, I m in trouble, Please Help!\n\n"); 

     if ((latitude != 0.0) && (longitude!= 0.0)) { 
      sb.append("Map Link:").append("\n").append("https://maps.google.com/maps?q=").append(latitude).append("%2C").append(longitude).append("\n\n"); 
     } 

     if (addd != null) { 
      sb.append("Address: ").append(addd).append("\n\n"); 
     } 
     sb.append("- My Application"); 


     setObj.Initialize(hcontext); 

     if (setObj.GetContactListCount()!=0) 
     { 

     for(int i=0;i<setObj.GetContactListCount();i++) 
     { 
      try 
      { 
       String SENT = "SMS_SENT"; 
       PendingIntent sentPI = PendingIntent.getBroadcast(hcontext, 0, new Intent(
         SENT), 0); 
       BroadcastReceiver sendSMS = new BroadcastReceiver() { 
        @Override 
        public void onReceive(Context arg0, Intent arg1) { 
         switch (getResultCode()) { 
          case Activity.RESULT_OK: 
           Toast.makeText(hcontext, "SMS sent Successfully", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
           Toast.makeText(hcontext, "Generic failure", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_NO_SERVICE: 
           Toast.makeText(hcontext, "No service", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_NULL_PDU: 
           Toast.makeText(hcontext, "Null PDU", 
             Toast.LENGTH_SHORT).show(); 
           break; 
          case SmsManager.RESULT_ERROR_RADIO_OFF: 
           Toast.makeText(hcontext, "Radio off", 
             Toast.LENGTH_SHORT).show(); 
           break; 
         } 
        } 
       }; 

       SmsManager localSmsManager = SmsManager.getDefault(); 
       if (sb.toString().length() <= 160) { 
        hcontext.registerReceiver(sendSMS, new IntentFilter(SENT)); 
        localSmsManager.sendTextMessage(setObj.GetContactListNumber()[i], null, sb.toString(), sentPI, null); 
       } else { 
        hcontext.registerReceiver(sendSMS, new IntentFilter(SENT)); 
        localSmsManager.sendTextMessage(setObj.GetContactListNumber()[i], null, sb.toString().substring(0, 159),sentPI, null); 
        localSmsManager.sendTextMessage(setObj.GetContactListNumber()[i], null, sb.toString().substring(160),sentPI, null); 
       } 

       } 
      catch (SecurityException localSecurityException) 
      { 
       Log.e("Error", "Security Exception, SMS permission denied"); 
       return; 
      } 
      } 
      } 
     else 
     { 
      Toast.makeText(hcontext,"please select a number",Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

Любая помощь будет высоко ценится, спасибо заранее!

+0

Взгляните на [эту асинхронную задачу] (https://github.com/selcukcihan/tahlil/blob/master/app/src/main/java/com/selcukcihan/android/tahlil/HttpPerformingTask.java), которая выполняет HTTP-запрос. Вы в основном создаете класс, расширяющий 'AsyncTask', а затем в' onPreExecute' вы создадите диалог прогресса, который вы должны «уволить» в обработчике 'onPostExecute'. 'AsyncTask' вызовет ваш' SmsHandler' внутри 'doInBackground'. –

ответ

0

1) Вам потребуется класс, который расширяет AsyncTask

2) Тогда попробуйте Фолля. сниппает -

public class SendSMS extends AsyncTask<String ,String,String>{ 
     ProgressDialog pd = new ProgressDialog(MainActivity.this); 

     @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
      //this method executes Before background process done 
       pd.setTitle("Please Wait!"); 
       pd.setMessage("Sending SMS"); 
       pd.show(); 
      } 

      @Override 
      protected String doInBackground(String... params) { 
      //Your logic here for sending SMS 
       return null; 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
      //this method executes after completion of background process 
      pd.dismiss(); //don't forget to dismiss 
      } 
} 

Надеется, что это поможет :)

+0

Благодарим вас за ответ, на самом деле важной частью является логика внутри метода doInBackground(), и, как вы можете видеть в моих кодах **, метод SendSms ** требует контекста приложения, и я передал его из mainActivity в этот метод сейчас здесь, как я могу получить контекст приложения? – Angel

+0

Вы можете создать вложенный класс для AsyncTask в текущем классе. И передать контекст как «MainActivity.this» или «getApplicationContext()». Надеюсь, это поможет. Проверьте это для более подробной информации. Http://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and –

+0

спасибо, что я использовал вложенный класс, и я могу получить контекст приложения и Я поместил всю логику отправки смс внутри метода ** doInBackground() **, но после того, как в течение нескольких секунд загрузился диалог выполнения, он разбил приложение и бросал _java.lang.RuntimeException: невозможно создать обработчик внутри потока, который не вызвал Looper. prepare() _ Исключение, я хочу, чтобы кто-нибудь помог мне в этом для отправки смс. – Angel

0

Создать активность и осуществлять Handler и AsyncTask

public class YourActivity extends AppCompatActivity{ 

// Constant variables to show progress dialogs... 
    private static final int SHOW_PROGRESS = 0x01; 
    private static final int STOP_PROGRESS = 0x02; 

// On create... 
    @Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.your_xml_layout); 

    new SendSms().execute(); 
    } 

// Your asynchronous class.. 
public class SendSms extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      mHandler.sendEmptyMessage(SHOW_PROGRESS); 
     } 


     @Override 
     protected Void doInBackground(Void... params) { 

      // Do your work here 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      mHandler.sendEmptyMessage(STOP_PROGRESS); 
     } 
    } 

    Handler mHandler = new Handler() { 

     public void handleMessage(android.os.Message msg) { 
      switch (msg.what) { 
       case SHOW_PROGRESS: 

        if (mProgressDialog == null) { 
         mProgressDialog = Utils.createProgressDialog(YourActivity.this); 
         mProgressDialog.show(); 
        } else 
         mProgressDialog.show(); 
        mHandler.removeMessages(SHOW_PROGRESS); 
        break; 
       case STOP_PROGRESS: 

        if (mProgressDialog != null && mProgressDialog.isShowing()) 
         mProgressDialog.dismiss(); 

        mHandler.removeMessages(STOP_PROGRESS); 
        break; 
    } 
}; 



    protected void onDestroy() { 
     super.onDestroy(); 
     if (mProgressDialog != null && mProgressDialog.isShowing()) 
      mProgressDialog.dismiss(); 
    } 

// Копируют следующие методы в классе Utils ..

public static ProgressDialog createProgressDialog(Context mContext) { 

     // if you want to set style.. 
     ProgressDialog dialog = new ProgressDialog(mContext, 
       R.style.MyProgressDialogStyle); 
     // or Otherwise.. 
     ProgressDialog dialog = new ProgressDialog(mContext); 

     try { 
      dialog.setCancelable(false); 
      dialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(mContext.getResources().getColor(android.R.color.transparent))); 
      dialog.show(); 
      dialog.setContentView(R.layout.custom_progress_dialog); 
     } catch (BadTokenException e) { 
      Utils.debug(e.getMessage()); 
     } 
     return dialog; 
    } 

И custom_progress_dialog в вашем макете.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:background="@android:color/transparent"> 

    <FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true"> 


     <ProgressBar 
      android:id="@+id/progressBar1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="10dip" /> 
    </FrameLayout> 

</RelativeLayout> 

Это то, что вам нужно. Пожалуйста, дайте мне знать, если у вас возникнут проблемы.

+0

Спасибо за ответ @Rethinavel, я попробую :) – Angel