В данный момент на G1 (Android) существует проблема отправки СМС на языке отличном от английского (русский, к примеру), точнее все языки, для кодирования которых используется unicode (2 байта). Проблема в том, что при отправке СМС на языке, для которого достаточен английский алфавит используется однобайтная кодировка текста, при отправке русского, должна использоваться двубайтная, но вот “что-то пошло не так” и стандартные функции всегда используют однобайтную, соотв. вместо русского приходит просто пустое сообщение. Выход – кодировать самому в PDU и отправлять. Но стандартными средствами этого не сделать, а делается все через …. И тут случайно бродя по инету – нашел.

public class SmsHelper {
	public static final int MAX_USER_DATA_BYTES = 140;
	private Context mContext;
	public SmsHelper(Context c) {
		mContext = c;
	}

	public void sendUnicodeMessage(String phone, String text) {
		SmsManager smsManager = SmsManager.getDefault();
		Class clazz = smsManager.getClass();

		try {
			Class[] types = new Class[4];
			types[0] = byte[].class;
			types[1] = byte[].class;
			types[2] = Class.forName("android.app.PendingIntent");
			types[3] = Class.forName("android.app.PendingIntent");

			Object[] params = new Object[4];
			params[0] = null;
			params[1] = getSubmitPdu(null, phone, text).encodedMessage;
			params[2] = PendingIntent
					.getBroadcast(mContext, 0, new Intent(), 0);
			// params[2] = null;
			params[3] = null;

			Method m = clazz.getDeclaredMethod("sendRawPdu", types);
			m.setAccessible(true);
			m.invoke(smsManager, params);

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	public static SubmitPdu getSubmitPdu(String scAddress,
			String destinationAddress, String message) {  
		if (message == null || destinationAddress == null) {
			return null;
		}
		
		SubmitPdu ret = new SubmitPdu();
		
		byte mtiByte = (byte) (0x01 | 0x00);
		
		ByteArrayOutputStream bo = getSubmitPduHead(scAddress,
				destinationAddress, mtiByte, false, ret);
		
		byte[] userData, textPart;
		// Encoding to the 7-bit alphabet failed. Let's see if we can
		// send it as a UCS-2 encoded message  
		
		try {
			textPart = message.getBytes("utf-16be");
		} catch (UnsupportedEncodingException uex) {
			uex.printStackTrace();
			return null;
		}
		
		userData = textPart;
		
		if (userData.length > MAX_USER_DATA_BYTES) {
			// Message too long
			return null;
		}

		// TP-Data-Coding-Scheme
		// Class 3, UCS-2 encoding, uncompressed
		bo.write(0x0b);
		
		// (no TP-Validity-Period)
		
		// TP-UDL
		bo.write(userData.length);
		
		bo.write(userData, 0, userData.length);
		
		ret.encodedMessage = bo.toByteArray();
		
		return ret;
	 }
	
	private static ByteArrayOutputStream getSubmitPduHead(String scAddress,
			 String destinationAddress, byte mtiByte,
			 boolean statusReportRequested, SubmitPdu ret) {
		ByteArrayOutputStream bo = new ByteArrayOutputStream(
				MAX_USER_DATA_BYTES + 40);
		
		// SMSC address with length octet, or 0
		if (scAddress == null) {
			ret.encodedScAddress = null;
		} else {
			ret.encodedScAddress = PhoneNumberUtils
				.networkPortionToCalledPartyBCDWithLength(scAddress);
		}  

		// TP-Message-Type-Indicator (and friends)
		if (statusReportRequested) {
			// Set TP-Status-Report-Request bit.
			mtiByte |= 0x20;
		}
		bo.write(mtiByte);  

		// space for TP-Message-Reference
		bo.write(0);  

		byte[] daBytes;  

		daBytes = PhoneNumberUtils
	    	.networkPortionToCalledPartyBCD(destinationAddress);  

		// destination address length in BCD digits, ignoring TON byte and pad
		// TODO Should be better.
		bo.write((daBytes.length - 1) * 2
				- ((daBytes[daBytes.length - 1] & 0xf0) == 0xf0 ? 1 : 0));  

		// destination address
		bo.write(daBytes, 0, daBytes.length);  

		// TP-Protocol-Identifier
		bo.write(0);  

		return bo;
	 }
}

Отправить можно так:

	SmsHelper sms = new SmsHelper(getApplicationContext());
	sms.sendUnicodeMessage("+74955555555", "Привет всем!");

источник blog.leshak.ru, andev.cn

Google Bookmarks Digg I.ua Linkstore Myscoop Communizm Ru-marks Webmarks Ruspace Linkomatic Kli.kz Web-zakladka Zakladok.net Reddit delicious Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong
by vovkab Нет комментариев »
Рубрики: Кусочки кода | Метки: , , ,

Комментарии закрыты.