2017-02-25 4 views
0

受信したSMSを読み込んでオンラインデータベースに投稿するAndroidアプリを開発しています。私はバックグラウンドでこれがすべて起こるように、UIは関係しません。ちょうど受信機とインテントサービス。XamarinとC#でデータベースにインポートするSMSリーダー

私が試したのは、受信したSMSを探すブロードキャストレシーバを作成し、それが見つかるとすぐにデータベースにSMSを送信するサービスを開始することです。私はこれを別のコードで開いたUIで動作させることができました。しかし、私はこれを可能にするためには、私のアプリを開かなくてもいいと思っています。

ここは私のコードです。何か間違えている?私がアプリを開いてメッセージを受け取ると、アプリがクラッシュするということが言いたいことです。誰かが私を助けることができるなら、私はそれをたくさんいただきたいと思います!

SmsReciever(私は受信機間違っを書いて知っている)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Telephony; 
using Android.Provider; 

namespace Services_Log 
{ 
    [BroadcastReceiver(Enabled = true, Label = "SMS Receiver")] 
    [IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })] 
    public class SmsReciever : BroadcastReceiver 
    { 
     private const string Tag = "SMSBroadcastReceiver"; 
     private const string IntentAction = "android.provider.Telephony.SMS_RECEIVED"; 
     public override void OnReceive(Context context, Intent intent) 
     { 
      try 
      { 
       Intent smsIntent = new Intent(context, typeof(SmsService)); 
       if (intent.Action != IntentAction) return; 
       SmsMessage[] messages = Telephony.Sms.Intents.GetMessagesFromIntent(intent); 
       for (int i=0; i<messages.Length; i++) 
       { 
        smsIntent.PutExtra("sms_number", messages[i].OriginatingAddress); 
        smsIntent.PutExtra("sms_body", messages[i].MessageBody); 
        context.StartService(smsIntent); 
       } 
      } 
      catch (Exception ex) 
      { 
       Toast.MakeText(context, ex.Message, ToastLength.Long).Show(); 
      } 
     } 
    } 
} 

SmsService

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using MySql.Data.MySqlClient; 
using System.Data; 
using Android.Service; 

namespace Services_Log 
{ 
    [Service] 
    public class SmsService : IntentService 
    { 
     public SmsService() : base("SmsService") 
     { 

     } 

     protected override void OnHandleIntent(Intent intent) 
     { 
      Context context = this; 
      Toast.MakeText(context,"Service Started", ToastLength.Long).Show(); 
      MySqlConnection con = new MySqlConnection("Server=db4free.net;Port=3306;database=testdbs;User Id=venoom;Password=takefree1;charset=utf8"); 

      string smsNumber = intent.GetStringExtra("sms_number"); 
      string smsBody = intent.GetStringExtra("sms_body"); 

      try 
      { 
       con.Open(); 
       MySqlCommand cmd = new MySqlCommand("INSERT INTO tableTest(number,message) VALUES(@number,@message)"); 
       cmd.Connection = con; 
       cmd.Parameters.AddWithValue("@number",smsNumber); 
       cmd.Parameters.AddWithValue("@message", smsBody); 
       Toast.MakeText(context, "Succsesfully uploaded to database!", ToastLength.Long).Show(); 
       cmd.ExecuteNonQuery(); 
      } 
      catch (MySqlException ex) 
      { 
       Toast.MakeText(context, ex.Message, ToastLength.Long).Show(); 
      } 
      finally 
      { 
       con.Close(); 
      } 
     } 
    } 
} 

MainActivity(左空白)

using Android.App; 
using Android.Widget; 
using Android.OS; 

namespace Services_Log 
{ 
    [Activity(Label = "Services_Log", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity 
    { 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      // Set our view from the "main" layout resource 
      // SetContentView (Resource.Layout.Main); 
     } 
    } 
} 

AndroidManifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="Services_Log.Services_Log" android:versionCode="1" android:versionName="1.0" android:installLocation="auto"> 
    <uses-sdk android:minSdkVersion="16" /> 
    <uses-permission android:name="android.permission.SEND_SMS" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <uses-permission android:name="android.permission.READ_SMS" /> 
    <uses-permission android:name="android.permission.BROADCAST_SMS" /> 
    <application android:label="Services Log" android:icon="@drawable/Icon"> 
     <receiver android:name="SmsReciever"> 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 
    <receiver android:name=".SmsReciever"> 
     <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
    </application> 
</manifest> 

答えて

2

はい、あなたは何か間違ったことをやっています。

レシーバー

を手動であなたAndroidManifest.xmlにサービスを追加しないでください。 BroadcastReceiverIntentFilter、およびServicesの属性を使用すると、AndroidManifestのxamarinコンパイラにこれらの受信者、サービス、アクティビティなどのエントリを生成するように指示します。あなたはobj\Debug\android

<receiver android:enabled="true" android:label="SMS Receiver" android:name="md563471986402eafe51037cbcf251950c3.SmsReciever"> 
    <intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 
    <receiver android:name="mono.android.Seppuku"> 
    <intent-filter> 
    <action android:name="mono.android.intent.action.SEPPUKU" /> 
    <category android:name="mono.android.intent.category.SEPPUKU.SmsApp.SmsApp" /> 
    </intent-filter> 
</receiver> 
<service android:name="md563471986402eafe51037cbcf251950c3.SmsService" /> 

で生成されたAndroidManifest.xmlをopeneningことにより、これを確認し、UIスレッドであなたのUIのものを実行することができます。

var handler = new Handler(Looper.MainLooper); 
handler.Post(() => 
{ 
    Toast.MakeText(context, $"{smsNumber}: {smsBody}", ToastLength.Long).Show(); 
}); 

データベース

は直接リモート・データベースに接続したことがないでください。あなたはあなたのアプリを公開してデータベースパスワードを譲り渡しています!ベストプラクティスは、常に中間のWebサービスを使用することです。

関連する問題