SORU
10 HAZİRAN 2010, PERŞEMBE


Nasıl Android MMS Veri Okumak için?

Okumak istiyorum MMS veri gördüm bölümü tablo mmssms.db mms girdi saklı; ben kullanarak bir imleç ve bilmek istiyorum uygun URI; Ben kullanarak "içerik://mms-sms/konuşmalar" veSütun adları""(Gönderilen), "Metin" veya "" ve "Veri" sütun resmin adı. Tabi Adres

mmssms.db ve bölüm Sütun Tablo şema gördüm.

CEVAP
22 HAZİRAN 2011, ÇARŞAMBA


Biraz zor bu hakkında bilgi bulmak için değil, burada bulunan tüm bilgileri toplamak. Eğer aceleniz varsa ya da sadece okumak için değil, atlamakNasıl bir SMS veri almak içinbölüm.

://mms-sms/içerik konuşmalar

Bu aynı zamanda bize MMS sorgu sağlar Mms and SMS provider... ve SMS veritabanları URİ, ve tek bir iş parçacığı içinde karıştırın (hangi denirkonuşmaları).

Neden önemli content://mms-sms/conversations urı? Bu standart yolu MMS ve SMS mesajları; örneğin, ne zaman sen almak bir SMS üzerine tıklayın ve bildirim çubuğu, o-ecek göndermek bir yayın niyet gibi bu: content://mms-sms/conversations/XXX nereye XXX kimliği konuşma.

Tüm konuşmaların bir listesini almak

Yapmanız gereken tek şey content://mms-sms/conversations Urı sorgu için:

ContentResolver contentResolver = getContentResolver();
final String[] projection = new String[]{"*"};
Uri uri = Uri.parse("content://mms-sms/conversations/");
Cursor query = contentResolver.query(uri, projection, null, null, null);

Not:query arama ve tüm sütunları dönmek istiyorum genellikle, projection parametre olarak null iletebilirsiniz. Ancak, bu * kullanıyorum bu yüzden bu sağlayıcı ile bunu yapamazsınız.

Şimdi Cursor Her zamanki gibi döngü. Bu kullanmak isterim daha önemli sütunları

  • _id ileti kimliğidir.Kaptan kurtarmaya belli mi?Gerçekten değil. Bu KİMLİĞİ detaylı bilgi content://sms content://mms kullanarak almak için kullanılabilir.
  • date açıklamaya gerek yok.
  • thread_id konuşma kimliğidir
  • body bu konuşma son SMS içeriği. Eğer Eğer bir metin parçası varsa bile MMS, eğer bu null olacak.

Not:content://mms-sms/conversations sorgu her konuşma SMS veya MMS son olan farklı konuşmaların bir listesini döndürecektir. Eğer content://mms-sms/conversations/xxx sorgu xxx olan konuşma, SMS ve/veya MMS dönecektir.

Nasıl SMS ve MMS arasında ayırt etmek için

Genellikle, işleme hangi bilmek isteyecektir. Belgeler diyor ki:

Sanal bir sütun, MmsSms.TYPE_DISCRIMINATOR_COLUMN olabilir bir projeksiyon talep edilmesi sorgu. Onun değeri ya da "mms" veya "sms", bağlı olarak, mesaj satır tarafından temsil edilmektedir. MMS mesajı veya SMS mesajı, sırasıyla.

this variable... o iş yapmak mümkün olmamıştır ancak atıfta bulunuyor sanırım. Nasıl yapacağımı söyleyin lütfen ya bu yazıyı düzenlemek varsa.

Şimdiye kadar bunu yaptım ve işe göründüğü gibi değil ama daha iyi bir yolu olmalı

ContentResolver contentResolver = getContentResolver();
final String[] projection = new String[]{"_id", "ct_t"};
Uri uri = Uri.parse("content://mms-sms/conversations/");
Cursor query = contentResolver.query(uri, projection, null, null, null);
if (query.moveToFirst()) {
    do {
        String string = query.getString(query.getColumnIndex("ct_t"));
        if ("application/vnd.wap.multipart.related".equals(string)) {
            // it's MMS
        } else {
            // it's SMS
        }
    } while (query.moveToNext());
}

Nasıl bir SMS veri almak için

SMS KİMLİĞİ var öyleyse yapmanız gereken tek şey:

String selection = "_id = " id;
Uri uri = Uri.parse("content://sms");
Cursor cursor = contentResolver.query(uri, null, selection, null, null);
String phone = cursor.getString(cursor.getColumnIndex("address"));
int type = cursor.getInt(cursor.getColumnIndex("type"));// 2 = sent, etc.
String date = cursor.getString(cursor.getColumnIndex("date"));
String body = cursor.getString(cursor.getColumnIndex("body"));

Nasıl bir MMS veri veri almak için?

MMSs biraz farklı. Farklı parçaları (metin, ses, resim, vb.) ile inşa edilebilir; burada her tür veriyi ayrı ayrı almak için ne kadar önemli olduğunu göreceksiniz.

Hadi mmsId değişken MMS kimliği var sanırım. content://mms/ sağlayıcı kullanarak bu MMS ile ilgili ayrıntılı bilgi elde edebiliriz:

Uri uri = Uri.parse("content://mms/");
String selection = "_id = "   mmsId;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);

Ancak, sadece ilginç sütunu ise zaten mesajı okundu 1 read.

Nasıl MMS metin içeriğini almak için

Burada örneğin content://mms/part... kullanmak zorundayız:

String selectionPart = "mid="   mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cursor = getContentResolver().query(uri, null,
    selectionPart, null, null);
if (cursor.moveToFirst()) {
    do {
        String partId = cursor.getString(cursor.getColumnIndex("_id"));
        String type = cursor.getString(cursor.getColumnIndex("ct"));
        if ("text/plain".equals(type)) {
            String data = cursor.getString(cursor.getColumnIndex("_data"));
            String body;
            if (data != null) {
                // implementation of this method below
                body = getMmsText(partId);
            } else {
                body = cursor.getString(cursor.getColumnIndex("text"));
            }
        }
    } while (cursor.moveToNext());
}

Metin farklı parçalar içeriyor olabilir. ama genelde tek kişi olur. Eğer öyleyse döngü kaldırmak istiyorsanız çoğu kez işe yarar. Bu getMmsText yöntemi gibi görünüyor:

private String getMmsText(String id) {
    Uri partURI = Uri.parse("content://mms/part/"   id);
    InputStream is = null;
    StringBuilder sb = new StringBuilder();
    try {
        is = getContentResolver().openInputStream(partURI);
        if (is != null) {
            InputStreamReader isr = new InputStreamReader(is, "UTF-8");
            BufferedReader reader = new BufferedReader(isr);
            String temp = reader.readLine();
            while (temp != null) {
                sb.append(temp);
                temp = reader.readLine();
            }
        }
    } catch (IOException e) {}
    finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {}
        }
    }
    return sb.toString();
}

Nasıl MMS görüntü almak için

Metin parçası elde etmekten daha aynı... tek fark, mıme tipi bir farklı için arıyor olacak

String selectionPart = "mid="   mmsId;
Uri uri = Uri.parse("content://mms/part");
Cursor cPart = getContentResolver().query(uri, null,
    selectionPart, null, null);
if (cPart.moveToFirst()) {
    do {
        String partId = cPart.getString(cPart.getColumnIndex("_id"));
        String type = cPart.getString(cPart.getColumnIndex("ct"));
        if ("image/jpeg".equals(type) || "image/bmp".equals(type) ||
                "image/gif".equals(type) || "image/jpg".equals(type) ||
                "image/png".equals(type)) {
            Bitmap bitmap = getMmsImage(partId);
        }
    } while (cPart.moveToNext());
}

Bu getMmsImage yöntemi gibi görünüyor:

private Bitmap getMmsImage(String _id) {
    Uri partURI = Uri.parse("content://mms/part/"   _id);
    InputStream is = null;
    Bitmap bitmap = null;
    try {
        is = getContentResolver().openInputStream(partURI);
        bitmap = BitmapFactory.decodeStream(is);
    } catch (IOException e) {}
    finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {}
        }
    }
    return bitmap;
}

Nasıl gönderenin adresi almak için

xxx MMS: kimliğidir content://mms/xxx/addr sağlayıcı kullanmanız gerekir

private String getAddressNumber(int id) {
    String selectionAdd = new String("msg_id="   id);
    String uriStr = MessageFormat.format("content://mms/{0}/addr", id);
    Uri uriAddress = Uri.parse(uriStr);
    Cursor cAdd = getContentResolver().query(uriAddress, null,
        selectionAdd, null, null);
    String name = null;
    if (cAdd.moveToFirst()) {
        do {
            String number = cAdd.getString(cAdd.getColumnIndex("address"));
            if (number != null) {
                try {
                    Long.parseLong(number.replace("-", ""));
                    name = number;
                } catch (NumberFormatException nfe) {
                    if (name == null) {
                        name = number;
                    }
                }
            }
        } while (cAdd.moveToNext());
    }
    if (cAdd != null) {
        cAdd.close();
    }
    return name;
}

Son düşünceler

  • Google, milyonlarca dolar, binlerce ile, bir öğrenci para yok anlayamıyorum ya da bir başkası bu API belgesi. Sen kontrol etmek için kaynak kodunu bilmek nasıl çalışır, hangisi daha kötü, yok olun halk bu sabitleri kullanılan sütun veritabanı var, bu yüzden bunları yazarken el.
  • Bir MMS içindeki veri başka türlü uygulayabilirsiniz aynı fikir üstünde öğrendim... sadece mıme tipi bilme meselesi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • L- Crysis

    L- Crysis

    30 Aralık 2011
  • Techmoan

    Techmoan

    31 Mayıs 2009
  • TheTwistedFrequency

    TheTwistedFr

    26 NİSAN 2010