2016-05-10 4 views
0



私はAndroidのSMS機能を使用しています。私は、自分のアプリケーション要件として限られた数の連絡先にsms経由でユーザーの住所と住所を送信できます。ユーザーが送信ボタンをクリックすると、進行状況ダイアログが表示され、すべての連絡先にSMSを送信した後、進行状況ダイアログが消えるはずです。

私はこれをたくさん探しましたが、それは私がアンドロイドの初心者なので、私のアプリケーションのためにそれを行う方法を私は非常に混乱させる!AsyncTaskの進捗状況ダイアログで複数のSMSを送信する

誰もが私のクラスで方法、ここで私は、SMSを送信するための私のJavaクラスを含めていますonPreExecute()、onPostExecute()とdoInBackground()を実装する方法で私を助けてくださいすることができます。

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'ハンドラで' dismiss'するべき進捗ダイアログを作成します。 'AsyncTask'は' doInBackground'メソッドの中で 'SmsHandler'を呼び出します。 –

答えて

0

1)AsyncTaskを拡張するClassが必要です。

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()メソッドの中にsmsを送信するすべてのロジックを入れましたが、数秒間進捗ダイアログをロードした後、アプリケーションがクラッシュして投げられました_java.lang.RuntimeException:Looperを呼び出さなかったスレッド内でハンドラを作成できません。準備()_例外、私は誰もがSMSを送信するために私を助けて欲しい。 – Angel

0

アクティビティを作成し、HandlerAsyncTask

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; 
    } 

and custom_progress_dialog in your layout.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

関連する問題