Как объединить два моих проекта 1.) Проект SmsReceiver и 2.) Проект вызывающего абонента - PullRequest
0 голосов
/ 14 января 2012

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

Мой проект получателя SMS работает так же, как и мой проект Caller.Я хочу объединить их как 1 приложение, но я не в курсе.кто-нибудь может мне помочь?

вот фрагмент кода, который я получил откуда-то и проверял работоспособность ..

Caller.java

package pi.redphone;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;



public class Caller extends Activity 
{
    private Context context;

    /** Called when the activity is first created. */
    @Override
       public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String num = "2217238";
        call(num);
    } 

 public void call(String number) 
{
    try 
    {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:"+number));
        startActivity(callIntent);
    } 
    catch (ActivityNotFoundException activityException) 
    {
        Log.e("dialing-example", "Call failed", activityException);
    }
}

}

номер телефона вприведенный выше код жестко запрограммирован, и после установки он будет звонить на этот номер 2217238

SmsReceiver.java

package pi.redphone;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SmsReceiver extends BroadcastReceiver
{


    public void onReceive(Context context, Intent intent) 
    {
        Bundle bundle = intent.getExtras();
        //SmsMessage msg = null;
        String sender = null;
        String msgBody = null;

        if(bundle != null)
        {
            Object[] sms = (Object[]) bundle.get("pdus");

            for(int i=0; i<sms.length; i++)
            {
                SmsMessage msg = SmsMessage.createFromPdu((byte[]) sms[i]);
                sender = msg.getOriginatingAddress(); //store sender's mobile #
                msgBody = msg.getMessageBody(); //msg content

            }
            Toast.makeText(context, sender, Toast.LENGTH_LONG ).show();


        }

    }

}

после установки приложение выдастошибка

Приложение Callforwarding неожиданно перестало работать.Пожалуйста, попробуйте еще раз ..

На самом деле, что я хочу сделать, это когда кто-то отправляет смс на мой андроид, мой SmsReceiver извлечет номер мобильного телефона отправителя и перезвонит .. номер отправителя сохраняется в этом отправитель переменная ..

Я хочу сделать что-то вроде этого

call(sender);

Но это не так просто ... Я могу объединить исходный код без ошибок, ноЯ не могу заставить его работать после установки ...

Это будет мое первое приложение для Android, если я смогу заставить его работать ..;)


Это мой файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pi.redphone"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.RECEIVE_SMS">

    </uses-permission>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".callForward"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

И это мой LogCAt:

01-15 03:11:50.265: I/jdwp(289): Ignoring second debugger -- accepting and dropping
01-15 03:12:30.756: W/KeyCharacterMap(289): No keyboard for id 0
01-15 03:12:30.756: W/KeyCharacterMap(289): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
01-15 03:13:05.095: D/dalvikvm(289): GC_EXPLICIT freed 1347 objects / 90832 bytes in 74ms
01-15 03:18:25.995: D/AndroidRuntime(357): Shutting down VM
01-15 03:18:26.045: W/dalvikvm(357): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
01-15 03:18:26.115: E/AndroidRuntime(357): FATAL EXCEPTION: main
01-15 03:18:26.115: E/AndroidRuntime(357): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{pi.redphone/pi.redphone.callForward}: java.lang.ClassCastException: pi.redphone.callForward
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.os.Looper.loop(Looper.java:123)
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.app.ActivityThread.main(ActivityThread.java:4627)
01-15 03:18:26.115: E/AndroidRuntime(357):  at java.lang.reflect.Method.invokeNative(Native Method)
01-15 03:18:26.115: E/AndroidRuntime(357):  at java.lang.reflect.Method.invoke(Method.java:521)
01-15 03:18:26.115: E/AndroidRuntime(357):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-15 03:18:26.115: E/AndroidRuntime(357):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-15 03:18:26.115: E/AndroidRuntime(357):  at dalvik.system.NativeStart.main(Native Method)
01-15 03:18:26.115: E/AndroidRuntime(357): Caused by: java.lang.ClassCastException: pi.redphone.callForward
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
01-15 03:18:26.115: E/AndroidRuntime(357):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
01-15 03:18:26.115: E/AndroidRuntime(357):  ... 11 more
01-15 03:18:35.085: I/Process(357): Sending signal. PID: 357 SIG: 9
01-15 03:31:01.475: D/AndroidRuntime(449): Shutting down VM
01-15 03:31:01.505: W/dalvikvm(449): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
01-15 03:31:01.555: E/AndroidRuntime(449): FATAL EXCEPTION: main
01-15 03:31:01.555: E/AndroidRuntime(449): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{pi.redphone/pi.redphone.callForward}: java.lang.ClassCastException: pi.redphone.callForward
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.os.Looper.loop(Looper.java:123)
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.app.ActivityThread.main(ActivityThread.java:4627)
01-15 03:31:01.555: E/AndroidRuntime(449):  at java.lang.reflect.Method.invokeNative(Native Method)
01-15 03:31:01.555: E/AndroidRuntime(449):  at java.lang.reflect.Method.invoke(Method.java:521)
01-15 03:31:01.555: E/AndroidRuntime(449):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-15 03:31:01.555: E/AndroidRuntime(449):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-15 03:31:01.555: E/AndroidRuntime(449):  at dalvik.system.NativeStart.main(Native Method)
01-15 03:31:01.555: E/AndroidRuntime(449): Caused by: java.lang.ClassCastException: pi.redphone.callForward
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
01-15 03:31:01.555: E/AndroidRuntime(449):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
01-15 03:31:01.555: E/AndroidRuntime(449):  ... 11 more
01-15 03:31:15.255: I/Process(449): Sending signal. PID: 449 SIG: 9

Приложение все еще не запускается.вот весь мой исходный код.

package pi.redphone;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class callForward extends BroadcastReceiver
 {
    /** Called when the activity is first created. */
    public void onReceive(Context context, Intent intent) 
    {
        Bundle bundle = intent.getExtras();
        //SmsMessage msg = null;
        String sender = null;
        String msgBody = null;

        if(bundle != null)
        {
            Object[] sms = (Object[]) bundle.get("pdus");

            for(int i=0; i<sms.length; i++)
            {
                SmsMessage msg = SmsMessage.createFromPdu((byte[]) sms[i]);
                sender = msg.getOriginatingAddress(); //store sender's mobile #
                msgBody = msg.getMessageBody(); //msg content

            }
            Toast.makeText(context, sender, Toast.LENGTH_LONG ).show();


        }

    }

}

У меня такое ощущение, что код правильный, но я не могу понять, как решить проблему ..


Не знаюзнаю, как следовать вашему предложению, потому что я всегда получаю ошибку.но вместо этого помогите мне проверить, правильно ли я поступаю ..

это мой последний код.вызов работает, но мой смс-приемник не работает.

Я не знаю, как позвонить моему

public class SmsReceiver extends BroadcastReceiver 

в действии, чтобы он прослушивал входящие смс.

Call4wardActivity.Java

package pi.redphone;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class Call4wardActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            call();

        }



    public void call() 
    {
        try {
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:123456789"));
            startActivity(callIntent);
        } catch (ActivityNotFoundException activityException) {
             Log.e("helloandroid dialing example", "Call failed", null);
        }
    }

    public class SmsReceiver extends BroadcastReceiver 
    {


        @Override
        public void onReceive(Context context, Intent intent) 
        {
            // TODO Auto-generated method stub
            Bundle bundle = intent.getExtras();        
            SmsMessage[] msgs = null;
           // String body = null;
            String sender = null;


            if (bundle != null)
            {
                //---retrieve the SMS message received---
                Object[] pdus = (Object[]) bundle.get("pdus");
                msgs = new SmsMessage[pdus.length];   

                for (int i=0; i<msgs.length; i++)
                {
                    msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);  
                    sender = msgs[i].getOriginatingAddress();

                }
                //---display the new SMS message---
                Toast.makeText(context, sender, Toast.LENGTH_LONG).show();

            }                       
        }

        }


    }

файл манифеста

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pi.redphone"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE"/>


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Call4wardActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

    <uses-permission android:name="android.permission.CALL_PHONE"/>

</manifest>

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Вам нужно будет опубликовать ошибку logcat для помощи при сбое.Но сделать телефонный звонок не так уж сложно.Мое первоначальное предположение заключается в том, что вам не хватает разрешений в вашем манифесте Android.Имеет ли он все разрешения для приложений SMS и Dialer?

Убедитесь, что отправитель хранит только номер телефона.Я считаю, что это так.

Вам действительно не нужно включать первое приложение.Единственный код, который вам нужен:

try  
{  
    Intent callIntent = new Intent(Intent.ACTION_CALL);  
    callIntent.setData(Uri.parse("tel:"+number));  
    startActivity(callIntent);  
}   
catch (ActivityNotFoundException activityException)   
{  
    Log.e("dialing-example", "Call failed", activityException);  
}  

Замените номер на отправителя, и все должно быть готово.

Если вы хотите сохранить оба действия, вы можете сделать следующее.Intent callIntent = new Intent (this, Caller.class);
callIntent.putExtra ("phoneNumber", отправитель);
startActivity (callIntent);

В процессе вызова вы будете

Bundle extras = getIntent().getExtras();  
string sender = extras.getInt("phoneNumber");  

Затем вы можете запросить пользователя и спросить, хотите ли вы, чтобы приложение позвонило по номеру.Или вы можете просто позвонить прямо сейчас.Если вы просто звоните по номеру # сразу без подтверждения, используйте 1-е решение, упомянутое выше в моем сообщении.

0 голосов
/ 26 января 2012

Я наконец решил это ..:)

вот основной код .. он позвонит отправителю SMS ..

SmsReceiver.java

package romel.pi.redphone;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

public class SmsReceiver extends BroadcastReceiver 
{

    private Context context;

    private static final String frwdcode = "**21*";
    String phoneNumber = "";
    @Override
    public void onReceive(Context context, Intent intent) 
    {
        System.out.println("Starting Receiver");

        //---get the SMS message passed in---
        Bundle bundle = intent.getExtras();        
        SmsMessage[] msgs = null;
        String str = "";            
        if (bundle != null)
        {
            //---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];            
            for (int i=0; i<msgs.length; i++){
                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);                
                //str += "SMS from " + msgs[i].getOriginatingAddress();  
                phoneNumber = msgs[i].getOriginatingAddress();
                str += "\n\nMessage:\n\n";
                str += msgs[i].getMessageBody().toString();
                str += "\n";        
            }
            try 
            {   

                Log.v("SmsReceiver", "entering TRY");
                this.context = context;
                MessageBodyParserTrigger();







            } 
            catch (Exception e) 
            {   
                Log.v("SendMail", e.getMessage(), e);   
            } 
        } 


    }

    void MessageBodyParserTrigger()
    {

        Object localObject1 = new Intent("android.intent.action.CALL");
        Object localObject2 = Uri.encode("#");
        ((Intent)localObject1).setData(Uri.parse("tel:"+ "**21*" + phoneNumber + localObject2));
        ((Intent)localObject1).addFlags(268435456);
        this.context.startActivity((Intent)localObject1);
        this.context.stopService(null);

    }



}

Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="romel.pi.redphone"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >




        <receiver android:name=".SmsReceiver"> 
            <intent-filter> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
            </intent-filter> 
        </receiver>





    </application>




</manifest>

надеюсь, что это может помочь другим ..

...