অ্যান্ড্রয়েডে এসএমএস এবং এমএমএস পাঠানো এবং গ্রহণ করা (প্রাক কিট ক্যাট অ্যান্ড্রয়েড ৪.৪)


131

আমি কীভাবে এসএমএস বার্তা প্রেরণ এবং গ্রহণ করতে পারি তা সন্ধান করেছি। এসএমএস বার্তা প্রেরণের জন্য আমাকে ক্লাসের পদ্ধতি sendTextMessage()এবং sendMultipartTextMessage()পদ্ধতিগুলি কল করতে হয়েছিল SmsManager। এসএমএস বার্তা পেতে, আমাকে AndroidMainfest.xmlফাইলে একটি রিসিভার নিবন্ধন করতে হয়েছিল register তারপরে আমাকে এর onReceive()পদ্ধতিটি ওভাররাইড করতে হয়েছিল BroadcastReceiver। আমি নীচে উদাহরণ অন্তর্ভুক্ত করেছি।

MainActivity.java

public class MainActivity extends Activity {
    private static String SENT = "SMS_SENT";
    private static String DELIVERED = "SMS_DELIVERED";
    private static int MAX_SMS_MESSAGE_LENGTH = 160;

    // ---sends an SMS message to another device---
    public static void sendSMS(String phoneNumber, String message) {

        PendingIntent piSent = PendingIntent.getBroadcast(mContext, 0, new Intent(SENT), 0);
        PendingIntent piDelivered = PendingIntent.getBroadcast(mContext, 0,new Intent(DELIVERED), 0);
        SmsManager smsManager = SmsManager.getDefault();

        int length = message.length();          
        if(length > MAX_SMS_MESSAGE_LENGTH) {
            ArrayList<String> messagelist = smsManager.divideMessage(message);          
            smsManager.sendMultipartTextMessage(phoneNumber, null, messagelist, null, null);
        }
        else
            smsManager.sendTextMessage(phoneNumber, null, message, piSent, piDelivered);
        }
    }

    //More methods of MainActivity ...
}

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private Context mContext;
    private Intent mIntent;

    // Retrieve SMS
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        mIntent = intent;

        String action = intent.getAction();

        if(action.equals(ACTION_SMS_RECEIVED)){

            String address, str = "";
            int contactId = -1;

            SmsMessage[] msgs = getMessagesFromIntent(mIntent);
            if (msgs != null) {
                for (int i = 0; i < msgs.length; i++) {
                    address = msgs[i].getOriginatingAddress();
                    contactId = ContactsUtils.getContactId(mContext, address, "address");
                    str += msgs[i].getMessageBody().toString();
                    str += "\n";
                }
            }   

            if(contactId != -1){
                showNotification(contactId, str);
            }

            // ---send a broadcast intent to update the SMS received in the
            // activity---
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("SMS_RECEIVED_ACTION");
            broadcastIntent.putExtra("sms", str);
            context.sendBroadcast(broadcastIntent);
        }

    }

    public static SmsMessage[] getMessagesFromIntent(Intent intent) {
        Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
        byte[][] pduObjs = new byte[messages.length][];

        for (int i = 0; i < messages.length; i++) {
            pduObjs[i] = (byte[]) messages[i];
        }
        byte[][] pdus = new byte[pduObjs.length][];
        int pduCount = pdus.length;
        SmsMessage[] msgs = new SmsMessage[pduCount];
        for (int i = 0; i < pduCount; i++) {
            pdus[i] = pduObjs[i];
            msgs[i] = SmsMessage.createFromPdu(pdus[i]);
        }
        return msgs;
    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

Andro আইডি

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

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <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.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.WRITE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:debuggable="true"
        android:icon="@drawable/ic_launcher_icon"
        android:label="@string/app_name" >

        <activity
            //Main activity...
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            //Activity 2 ...
        </activity>
        //More acitivies ...

        // SMS Receiver
        <receiver android:name="com.myexample.receivers.SMSReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

তবে, আমি ভাবছিলাম যে আপনি এমএমএস বার্তাগুলি অনুরূপ ফ্যাশনে প্রেরণ করতে এবং গ্রহণ করতে পারেন। কিছু গবেষণা করার পরে, ব্লগে প্রদত্ত অনেকগুলি উদাহরণ Intentস্থানীয় মেসেজিং অ্যাপ্লিকেশনটিতে কেবল একটি পাস করে। আমি আমার অ্যাপ্লিকেশন না রেখে এমএমএস পাঠানোর চেষ্টা করছি। এমএমএস পাঠানোর এবং গ্রহণের কোনও মানক উপায় বলে মনে হচ্ছে না। যে কেউ এই কাজ করতে অর্জিত হয়েছে?

এছাড়াও, আমি সচেতন যে এসএমএস / এমএমএস কন্টেন্টপ্রাইডারটি আনুষ্ঠানিক অ্যান্ড্রয়েড এসডিকে-র অংশ নয়, তবে আমি ভাবছিলাম যে কেউ এটি বাস্তবায়ন করতে সক্ষম হয়েছেন। কোন সাহায্য ব্যাপকভাবে প্রশংসা করা হয়।

হালনাগাদ

আমি একটি যোগ করেছি BroadcastReceiverকরার AndroidManifest.xmlফাইল এমএমএস বার্তা গ্রহণ করতে

<receiver android:name="com.sendit.receivers.MMSReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />

        <data android:mimeType="application/vnd.wap.mms-message" />
    </intent-filter>
</receiver>

এমএমএসআরসিভার ক্লাসে, onReceive()পদ্ধতিটি কেবলমাত্র ফোন নম্বরটি ধরতে সক্ষম হয় যে বার্তাটি পাঠানো হয়েছিল। আপনি কীভাবে কোনও এমএমএস থেকে অন্যান্য গুরুত্বপূর্ণ জিনিসগুলি মিডিয়া সংযুক্তি (চিত্র / অডিও / ভিডিও), বা এমএমএসের পাঠ্যের মতো ফাইল পাথ ধরেন?

MMSReceiver.java

public class MMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_MMS_RECEIVED = "android.provider.Telephony.WAP_PUSH_RECEIVED";
    private static final String MMS_DATA_TYPE = "application/vnd.wap.mms-message";

     // Retrieve MMS
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        String type = intent.getType();

        if(action.equals(ACTION_MMS_RECEIVED) && type.equals(MMS_DATA_TYPE)){

            Bundle bundle = intent.getExtras();

            Log.d(DEBUG_TAG, "bundle " + bundle);
            SmsMessage[] msgs = null;
            String str = "";
            int contactId = -1;
            String address;

            if (bundle != null) {

                byte[] buffer = bundle.getByteArray("data");
                Log.d(DEBUG_TAG, "buffer " + buffer);
                String incomingNumber = new String(buffer);
                int indx = incomingNumber.indexOf("/TYPE");
                if(indx>0 && (indx-15)>0){
                    int newIndx = indx - 15;
                    incomingNumber = incomingNumber.substring(newIndx, indx);
                    indx = incomingNumber.indexOf("+");
                    if(indx>0){
                        incomingNumber = incomingNumber.substring(indx);
                        Log.d(DEBUG_TAG, "Mobile Number: " + incomingNumber);
                    }
                }

                int transactionId = bundle.getInt("transactionId");
                Log.d(DEBUG_TAG, "transactionId " + transactionId);

                int pduType = bundle.getInt("pduType");
                Log.d(DEBUG_TAG, "pduType " + pduType);

                byte[] buffer2 = bundle.getByteArray("header");      
                String header = new String(buffer2);
                Log.d(DEBUG_TAG, "header " + header);

                if(contactId != -1){
                    showNotification(contactId, str);
                }

                // ---send a broadcast intent to update the MMS received in the
                // activity---
                Intent broadcastIntent = new Intent();
                broadcastIntent.setAction("MMS_RECEIVED_ACTION");
                broadcastIntent.putExtra("mms", str);
                context.sendBroadcast(broadcastIntent);

            }
        }

    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

Android.provider.Telephony এর ডকুমেন্টেশন অনুসারে :

ব্রডকাস্ট অ্যাকশন: ডিভাইসটির মাধ্যমে একটি নতুন পাঠ্য ভিত্তিক এসএমএস বার্তা পেয়েছে। অভিপ্রায়টির অতিরিক্ত অতিরিক্ত মান থাকবে:

pdus- একটি Object[]এর byte[]PDUs সেই বার্তার আপ করতে ধারণকারী গুলি।

অতিরিক্ত মানগুলি ব্যবহার করে উত্তোলন করা যেতে পারে getMessagesFromIntent(android.content.Intent) যদি কোনও ব্রডকাস্টার্সিভার এই উদ্দেশ্যটি প্রক্রিয়াকরণের সময় কোনও ত্রুটির মুখোমুখি হয় তবে ফলাফল ফলাফলটি যথাযথভাবে সেট করা উচিত।

 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
 public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

ব্রডকাস্ট অ্যাকশন: ডিভাইসটির মাধ্যমে একটি নতুন ডেটা ভিত্তিক এসএমএস বার্তা এসেছে। অভিপ্রায়টির অতিরিক্ত অতিরিক্ত মান থাকবে:

pdus- একটি Object[]এর byte[]PDUs সেই বার্তার আপ করতে ধারণকারী গুলি।

GetMessagesFromIntent (android.content.Inttent) ব্যবহার করে অতিরিক্ত মানগুলি বের করা যেতে পারে। যদি এই উদ্দেশ্যটি প্রক্রিয়াকরণের সময় কোনও ব্রডকাস্টারসিভার কোনও ত্রুটির মুখোমুখি হয় তবে ফলাফলের কোডটি যথাযথভাবে সেট করা উচিত।

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";

ব্রডকাস্ট অ্যাকশন: ডিভাইসটির মাধ্যমে একটি নতুন ডাব্লুএপি পুশ বার্তা পেয়েছে। অভিপ্রায়টির অতিরিক্ত অতিরিক্ত মান থাকবে:

transactionId (Integer) - ডাব্লুএপি লেনদেনের আইডি

pduType (Integer) - ওয়াপ পিডিইউ টাইপ `

header (byte[]) - বার্তা শিরোনাম

data (byte[]) - বার্তাটির ডেটা পেলোড

contentTypeParameters (HashMap<String,String>) - সামগ্রীর ধরণের সাথে যুক্ত কোনও প্যারামিটার (ডাব্লুএসপি কনটেন্ট-টাইপ শিরোনাম থেকে ডিকোড করা)

যদি এই উদ্দেশ্যটি প্রক্রিয়াকরণের সময় কোনও ব্রডকাস্টার্সিভার কোনও ত্রুটির মুখোমুখি হয় তবে ফলাফলের কোডটি যথাযথভাবে সেট করা উচিত। কন্টেন্ট টাইপপ্যারামিটারের অতিরিক্ত মান হ'ল তাদের নামের দ্বারা চিহ্নিত কন্টেন্ট প্যারামিটারের মানচিত্র। যদি কোনও অ-স্বাক্ষরিত সুপরিচিত পরামিতিগুলির মুখোমুখি হয় তবে মানচিত্রের কীটি 'আনইসাইনড / 0 এক্স ...' হবে, যেখানে '...' হ'ল আনসাইন করা প্যারামিটারের হেক্স মান। যদি কোনও প্যারামিটারের ন-মান থাকে তবে মানচিত্রে মানটি শূন্য হবে।

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";

আপডেট # 2

আমি কীভাবে অতিরিক্ত কোনও পাস PendingIntentকরতে হয় তা সন্ধান করেছি BroadcastReceiver: একটি অ্যান্ড্রয়েড পেন্ডিংআইসেন্ট এক্সট্রা, ব্রডকাস্টআরসিভার দ্বারা প্রাপ্ত নয়

যাইহোক, অতিরিক্ত প্রেরণ পরার SendBroadcastReceiver না SMSReceiverএসএমএসআরসিভারে কীভাবে আমি অতিরিক্ত পাস করতে পারি ?

আপডেট # 3

এমএমএস গ্রহণ

তাই আরও গবেষণা করার পরে আমি এ নিবন্ধনের কিছু পরামর্শ দেখেছি ContentObserver। এই content://mms-sms/conversationsবিষয়বস্তু সরবরাহকারীতে যখন কোনও পরিবর্তন হয় তখন আপনি সনাক্ত করতে পারেন , ফলস্বরূপ আপনাকে আগত এমএমএস সনাক্ত করার অনুমতি দেয়। আমি যে কাজটি পেয়েছি এটি পেতে এটি নিকটতম উদাহরণ: এমএমএস গ্রহণ করা

তবে mainActivityটাইপের একটি ভেরিয়েবল রয়েছে ServiceControllerServiceControllerক্লাসটি কোথায় বাস্তবায়িত হয়? নিবন্ধিত অন্য কোন বাস্তবায়ন আছে ContentObserver?

এমএমএস প্রেরণ করা হচ্ছে

এমএমএস প্রেরণের জন্য, আমি এই উদাহরণটি দেখতে পেয়েছি: এমএমএস প্রেরণ করুন

সমস্যাটি হ'ল আমি এই কোডটি আমার নেক্সাস 4 এ চালানোর চেষ্টা করেছি যা অ্যান্ড্রয়েড v4.2.2 এ রয়েছে এবং আমি এই ত্রুটিটি পেয়েছি:

java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.

ক্লাসের পদ্ধতিতে Carriersকন্টেন্টপ্রাইডারকে জিজ্ঞাসা করার পরে ত্রুটিটি ছুঁড়ে ফেলা হয় ।getMMSApns()APNHelper

final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), null, null, null, null);

স্পষ্টতই আপনি Android 4.2 এপিএন পড়তে পারবেন না

অপারেশন সম্পাদনের জন্য মোবাইল ডেটা ব্যবহার করে (এমএমএস প্রেরণের মতো) এবং ডিভাইসে উপস্থিত ডিফল্ট এপিএন সেটিংস জানেন না এমন সমস্ত অ্যাপ্লিকেশনগুলির বিকল্প কী?

আপডেট # 4

এমএমএস প্রেরণ করা হচ্ছে

আমি এই উদাহরণটি অনুসরণ করার চেষ্টা করেছি: এমএমএস প্রেরণ করুন

যেমন @ সাম তার উত্তরে পরামর্শ দিয়েছে:

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.

সুতরাং এখন আমি আর সুরক্ষার ধারণার ত্রুটিগুলি পাই না। আমি এখন অ্যান্ড্রয়েড কিটক্যাট নেক্সাস 5 এ পরীক্ষা করছি। নমুনা কোড চালানোর পরে এটি আমাকে কল করার পরে একটি 200 প্রতিক্রিয়া কোড দেয়

MMResponse mmResponse = sender.send(out, isProxySet, MMSProxy, MMSPort);

তবে আমি যার সাথে এমএমএস প্রেরণের চেষ্টা করেছি তার সাথে আমি চেক করেছিলাম। এবং তারা বলেছিল যে তারা কখনও এমএমএস পায় না।


আপনি কি এই টিউটোরিয়াল আগে দেখেছেন? maximbogatov.wordpress.com/2011/08/13/mms-in-android
হেমিটার্নাল

3
হ্যাঁ আমার আছে. আমি ম্যাক্সিমের উত্তর একসাথে পাইক করার চেষ্টা করেছি তবে এটি কাজ করতে সক্ষম হচ্ছি না। সেখানে অনেকগুলি ক্লাস রয়েছে যা android.provider.telephony আমদানি করে যা মনে হয় অবহেলা করা হয়েছে।
toobsco42

: এবং সম্ভবতঃ, পড়ার @ সাহিল এর উত্তর পরে, সেই জন্যই এই চেষ্টা করেছি stackoverflow.com/questions/2972845/...
HaemEternal

উত্তরটি একসাথে কীভাবে টুকরো করা যায় তা আমি নিশ্চিত নই, যদিও এটি @ সাহিলের উত্তরের সাথে খুব মিল রয়েছে।
toobsco42

হাই @ টোবস্কো 42 আপনি কি উপরে উল্লিখিত সমস্ত প্রশ্নের জন্য সমাধান খুঁজে পেতে সক্ষম হন ..?
কমল_টেক_ভিউ

উত্তর:


15

উপরে বর্ণিত ঠিক একই সমস্যাটি আমার ছিল (গ্যালাক্সি নেক্সাস টি-মোবাইল ইউএসএ) এটি মোবাইল ডেটা বন্ধ থাকার কারণে because

জেলি বিনে এটি হ'ল: সেটিংস> ডেটা ব্যবহার> মোবাইল ডেটা

নোট করুন যে এমএমএস পাঠাতে বা একটি গ্রহণের জন্য আমার কাছে মোবাইল ডেটা পিআরআইআর চালু করতে হবে। আমি যদি মোবাইল ডেটা বন্ধ করে এমএমএস পাই তবে আমি একটি নতুন বার্তার বিজ্ঞপ্তি পেয়ে যাব এবং ডাউনলোড বোতামের সাহায্যে আমি বার্তাটি গ্রহণ করব। তবে পূর্বে যদি আমার কাছে মোবাইল ডেটা না থাকে তবে আগত এমএমএস সংযুক্তিটি পাবেন না। এমনকি যদি আমি বার্তাটি পাওয়ার পরে এটি চালু করি।

কোনও কারণে যখন আপনার ফোন সরবরাহকারী আপনাকে এমএমএস প্রেরণ এবং গ্রহণের সক্ষমতা দিয়ে সক্ষম করে আপনার অবশ্যই মোবাইল ডেটা সক্ষম করতে হবে, আপনি যদি ওয়াইফাই ব্যবহার করছেন, মোবাইল ডেটা সক্ষম থাকলেও আপনি এমএমএস গ্রহণ এবং প্রেরণ করতে সক্ষম হবেন, এমনকি যদি আপনার ডিভাইসে ওয়াইফাই আপনার ইন্টারনেট হিসাবে প্রদর্শিত হচ্ছে।

এটি একটি আসল ব্যথা, যেন আপনার এটি চালু না থাকে, মোবাইল ডেটা চালু করার পরেও বার্তাটি অনেকটা হ্যাং করতে পারে এবং এতে ডিভাইসটির পুনরায় বুট লাগতে পারে।


এছাড়াও আপনাকে অবশ্যই জেনে রাখতে হবে যে একটি এসএমএস এবং এমএমএস পাঠানো ব্যাকগ্রাউন্ডে 2 সম্পূর্ণ ভিন্ন জিনিস। পাঠ্য সহ অতিরিক্ত আইটেম (মিডিয়া) প্রেরণের জন্য এমএমএস হ'ল একটি ইন্টারনেট ভিত্তিক নেটওয়ার্ক পরিষেবা। প্রদত্ত কোডটি এমন কয়েকটি ডিভাইসে সূক্ষ্মভাবে কাজ করে যা আমি পরীক্ষিত করেছি। PS: আপনি নোকিয়া অংশটি উপেক্ষা করতে পারেন।
মনন শর্মা

আমি যখন এই উদাহরণটি চালাই, লগগেটে এটি মুদ্রিত হয়: 02-24 13: 32: 40.872: ভি / সেন্ড এমএমএসএকটিভিটি (5686): TYPE_MOBILE_MMS সংযুক্ত নয়, জামিন 02-24 13: 32: 40.882: ভি / সেন্ড এমএমএসঅ্যাক্টিভিটি (5686): টাইপ TYPE_MOBILE_MMS নয়, জামিন এটিও বলেছে: java.lang.SecurityException: APN সেটিংস লেখার অনুমতি নেই: ব্যবহারকারীর 10099 বা বর্তমান প্রক্রিয়াতেও Android.permission নেই। WRITE_APN_SETTINGS S দেখে মনে হচ্ছে এটি এই কোয়েরিটি সম্পাদন করতে পারে না: চূড়ান্ত কার্সার apnCursor = this.context.getContentResolver ()। কোয়েরি (উরি.উইথঅ্যাপেন্ডপথ (ক্যারিয়ার্স.কন্টিওউরি, "বর্তমান"), নাল, নাল, নাল, নাল); আমি একটি নেক্সাস 4 এ পরীক্ষা করছি
toobsco42

এছাড়াও এটি একই উদাহরণ যা @ সাহিল সরবরাহ করেছেন।
toobsco42

7

কোনও আনুষ্ঠানিক এপিআই সমর্থন নেই যার অর্থ এটি জনসাধারণের জন্য নথিভুক্ত নয় এবং গ্রন্থাগারগুলি যে কোনও সময় পরিবর্তন হতে পারে। আমি বুঝতে পারছি আপনি অ্যাপ্লিকেশনটি ছাড়তে চান না তবে অন্য যে কেউ ভাবছেন তার উদ্দেশ্যে আপনি কীভাবে এটি করছেন তা এখানে।

public void sendData(int num){
    String fileString = "..."; //put the location of the file here
    Intent mmsIntent = new Intent(Intent.ACTION_SEND);
    mmsIntent.putExtra("sms_body", "text");
    mmsIntent.putExtra("address", num);
    mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(fileString)));
    mmsIntent.setType("image/jpeg");
    startActivity(Intent.createChooser(mmsIntent, "Send"));

}

বার্তা সরবরাহের ট্র্যাক করার মতো জিনিসগুলি কীভাবে করা যায় তা আমি পুরোপুরি বুঝতে পারি নি তবে এটি পাঠানো উচিত।

এসএমএসের মতোই আপনাকে এমএমএসের প্রাপ্তিতে সতর্ক করা যেতে পারে। রিসিভারের অভিপ্রায় ফিল্টারটি দেখতে দেখতে এটি দেখতে পাওয়া উচিত।

<intent-filter>
    <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
    <data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>

এটি কি কেবল নেটিভ মেসেজিং অ্যাপ্লিকেশনটি চালু করে না?
toobsco42

1
হ্যাঁ এ সম্পর্কে দুঃখিত। আমি ঠিক বুঝতে পেরেছি যে আপনি কীভাবে এটি করতে জানেন। আমি যদিও এমএমএস গ্রহণ করব তা যুক্ত করেছিলাম।
ব্যবহারকারী 1959417

ধন্যবাদ, আমি সম্প্রতি এমএমএসের অংশটি বাস্তবায়ন BroadcastReceiverকরেছি এবং Intent Filterআপনি পোস্ট করেছেন তা ব্যবহার করেছি। আমি শীঘ্রই এই প্রশ্ন আপডেট করব।
toobsco42

4

অ্যাপ্লিকেশন সেটিংস লেখার অনুমতি ছাড়াই অ্যান্ড্রয়েড ap.০ এপিআই ১৪ বা তার চেয়ে বেশি এর জন্য একটি এমএমএস পাঠাতে, আপনি এই লাইব্রেরিটি ব্যবহার করতে পারেন : অ্যান্ড্রয়েড থেকে এমএনসি এবং এমসিসি কোডগুলি পুনরুদ্ধার করুন, তারপরে কল করুন

Carrier c = Carrier.getCarrier(mcc, mnc);
if (c != null) {
    APN a = c.getAPN();
    if (a != null) {
        String mmsc = a.mmsc;
        String mmsproxy = a.proxy; //"" if none
        int mmsport = a.port; //0 if none
    }
}

এটি ব্যবহার করতে, জাসুপ এবং ড্রোড প্রিজম জারটি নির্মাণের পথে যুক্ত করুন এবং com.droidprism আমদানি করুন * *


আরে @ স্যাম, আমি আমার প্রকল্পে .jar ফাইলটি যুক্ত করেছি তবে ক্যারিয়ার অবজেক্টটি তাত্ক্ষণিক করে রেখায় এই ত্রুটিটি পাচ্ছি: java.lang.NoClassDefFoundError: com.droidprism.Carrier আপনার কি ঘটছে?
toobsco42

কোন। আপনাকে বিল্ড পাথটিতে জসপ যোগ করতে হবে, বিল্ড পাথটিতে জার রাখতে হবে এবং com.droidprism আমদানি করতে হবে। *; আমি উত্তরটি সম্পাদনা করব। অ্যান্ড্রয়েডে এটি করতে, প্রথমে জর্গুলি libs ডিরেক্টরিতে যুক্ত করুন, তারপরে ইতোমধ্যে libs ডিরেক্টরিতে জারগুলি ব্যবহার করার জন্য প্রকল্পটি নির্মাণের পথটি কনফিগার করুন, তারপরে বিল্ড পাথের কনফিগারেশন ক্লিক করুন ক্রমটি রফতানি করুন এবং জারের বাক্সগুলি পরীক্ষা করুন এবং সরান বিল্ড অর্ডার শীর্ষে jsoup এবং droidprism জার।
স্যাম আদমশ

জসপ .জার যুক্ত করে NoClassDefFoundError সমাধান করেছে। আমি এখন এপিএন সেটিংস পেতে পারি। পরবর্তী পদক্ষেপটি কীভাবে এমএমএস প্রেরণ করা যায় তা নির্ধারণ করা।
toobsco42

3

অ্যান্ড্রয়েডে এমএমএস প্রেরণের জন্য কোনও এসডিকে সমর্থন আছে বলে আমি মনে করি না। আমি এখনও পাওয়া যায় নি এটেলস্ট দেখুন । কিন্তু একটি লোক তা দাবি করেছে। এই পোস্টে একবার দেখুন।

অ্যান্ড্রয়েডে আমার অ্যাপ্লিকেশন থেকে এমএমএস প্রেরণ করুন


আমি নোকিয়া বাস্তবায়নের অ্যান্ড্রয়েডব্রিজ.ব্লগস্পট.কম পোস্টের মন্তব্যে দেখেছি এবং দেখে মনে হচ্ছে অনেক লোকেরা তাদের ডিভাইসগুলিতে এটি কাজ করতে সমস্যা বোধ করছে।
toobsco42

@ toobsco42 সুতরাং, এটির জন্য এখনও কোনও সমর্থন নেই।
সাহিল মহাজন এমজে

-2

আমি হতাশা বুঝতে পারি না। কেন কেবল এমন একটি ব্রডকাস্ট্রিসিভার তৈরি করবেন না যা এই অভিপ্রায়টির জন্য ফিল্টার করে:

android.provider.Telephony.MMS_RECEIVED

আমি আরও কিছুক্ষণ যাচাই করেছি এবং এটি (মূলযুক্ত ফোন) পেতে আপনাকে সিস্টেমের স্তরের অ্যাক্সেসের প্রয়োজন হতে পারে।


3
আরে @ j2emanue, সমস্যাটি হ'ল আপনি এই অভিপ্রায়টি পাওয়ার পরে কীভাবে আপনি এমএমএসের সামগ্রীটি পাবেন? যদি কোনও এমএমএসে চিত্র এবং পাঠ্য থাকে, আপনি কীভাবে এই উপাদানগুলি নিষ্কাশন করবেন।
toobsco42

তবে আমি লক্ষ্য করেছি যে বাইট অ্যারে অতিরিক্ত রয়েছে তবে আপনি যদি এটি করেন তবে আপনি পেতে পারেন i আমি নিশ্চিত না তবে কীভাবে এটি পার্স করা যায় তা দুঃখিত।
j2emanue

আমি এটি বিশ্লেষণ করতে সক্ষম তবে আমি যে বিষয়গুলি পেতে পারি তা হ'ল এমএমএসটি কোথা থেকে এসেছিল এবং এমএমএসের বিষয়বস্তু যেখানে সংরক্ষণ করা হয় সেই বিষয়বস্তু অবস্থান। তবে এই ইউআরএলটি অ্যাক্সেসযোগ্য নয়।
toobsco42

-2

SmsListenerClass

public class SmsListener extends BroadcastReceiver {

static final String ACTION =
        "android.provider.Telephony.SMS_RECEIVED";

@Override
public void onReceive(Context context, Intent intent) {

    Log.e("RECEIVED", ":-:-" + "SMS_ARRIVED");

    // TODO Auto-generated method stub
    if (intent.getAction().equals(ACTION)) {

        Log.e("RECEIVED", ":-" + "SMS_ARRIVED");

        StringBuilder buf = new StringBuilder();
        Bundle bundle = intent.getExtras();
        if (bundle != null) {

            Object[] pdus = (Object[]) bundle.get("pdus");

            SmsMessage[] messages = new SmsMessage[pdus.length];
            SmsMessage message = null;

            for (int i = 0; i < messages.length; i++) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    String format = bundle.getString("format");
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
                } else {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }

                message = messages[i];
                buf.append("Received SMS from  ");
                buf.append(message.getDisplayOriginatingAddress());
                buf.append(" - ");
                buf.append(message.getDisplayMessageBody());
            }

            MainActivity inst = MainActivity.instance();
            inst.updateList(message.getDisplayOriginatingAddress(),message.getDisplayMessageBody());

        }

        Log.e("RECEIVED:", ":" + buf.toString());

        Toast.makeText(context, "RECEIVED SMS FROM :" + buf.toString(), Toast.LENGTH_LONG).show();

    }
}

কার্যকলাপ

@Override
public void onStart() {
    super.onStart();
    inst = this;
}

public static MainActivity instance() {
    return inst;
}

public void updateList(final String msg_from, String msg_body) {

    tvMessage.setText(msg_from + " :- " + msg_body);

    sendSMSMessage(msg_from, msg_body);

}

protected void sendSMSMessage(String phoneNo, String message) {

    try {
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, message, null, null);
        Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

স্পষ্ট

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS"/>

<receiver android:name=".SmsListener">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.