2013-04-17 34 views
13

Próbuję pobrać zawartość obrazu MMS za pośrednictwem adresu URL MMS, ale wraca ona z odpowiedzią serwera 403 (Forbidden) z nieprawidłowym numerem MSISDN. Wkleiłem poniższy kod w celach informacyjnych. Z góry dziękuję!android mms pobierz treść mms za pomocą adresu mms url

private static boolean downloadThroughGateway(Context context, String host, 
      String port, String urlMms) throws Exception { 
     URL url = new URL(urlMms); 

     // Set-up proxy 
     if (host != null && port != null && host.equals("") && !port.equals("")) { 
      Log.d(TAG, "[MMS Receiver] Setting up proxy (" + host + ":" + port 
        + ")"); 
      Properties systemProperties = System.getProperties(); 
      systemProperties.setProperty("http.proxyHost", host); 
      systemProperties.setProperty("http.proxyPort", port); 
      systemProperties.setProperty("http.keepAlive", "false"); 
     } 

     // Open connection 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     // Disable cache 
     connection.setUseCaches(false); 

     // Set the timeouts 
     connection.setConnectTimeout(TIMEOUT); 
     connection.setReadTimeout(TIMEOUT); 

     // Connect to the MMSC 
     Log.d(TAG, "[MMS Receiver] Connecting to MMS Url " + urlMms); 
     connection.connect(); 

     try { 
      Log.d(TAG, 
        "[MMS Receiver] Response code is " 
          + connection.getResponseCode()); 

      if (connection.getContentLength() >= 0) { 
       Log.d(TAG, "[MMS Receiver] Download MMS data (Size: " 
         + connection.getContentLength() + ")"); 
       byte[] responseArray = new byte[connection.getContentLength()]; 
       DataInputStream i = new DataInputStream(
         connection.getInputStream()); 
       int b = 0; 
       int index = 0; 
       while ((b = i.read()) != -1) { 
        responseArray[index] = (byte) b; 
        index++; 
       } 
       i.close(); 

       // Parse the response 
       MmsDecoder parser = new MmsDecoder(responseArray); 
       parser.parse(); 

       byte[][] imageBytes = new byte[parser.getParts().size()][]; 
       for (int j = 0; j < parser.getParts().size(); j++) { 
        imageBytes[j] = parser.getParts().get(j).getContent(); 
       } 

       // Insert into db 
       // Uri msgUri = MmsHelper.insert(context, parser.getFrom(), 
       // parser.getSubject(), imageBytes); 
       // ContentValues updateValues = new ContentValues(); 
       // updateValues.put("read", 0); 
       // context.getContentResolver().update(msgUri, updateValues, 
       // null, 
       // null); 

       // Close the connection 
       Log.d(TAG, "[MMS Receiver] Disconnecting ..."); 
       connection.disconnect(); 

       System.gc(); 

       // Callback 
       // if (bi != null) 
       // bi.onReceiveMms(context, msgUri); 

       return true; 
      } 

      // Close the connection 
      Log.d(TAG, "[MMS Receiver] Disconnecting ..."); 
      connection.disconnect(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return false; 
    } 
+0

Co z poświadczeniami dostępu użytkownika? Czy sprawdziłeś, czy ustawione są odpowiednie poświadczenia dostępu do usługi danych. Czy próbowałeś użyć narzędzi (Network Protocol Analyzer) takich jak WireShark itp. Do odszyfrowania żądania przesłania MMS (HTTP PDU) i odpowiadającej odpowiedzi ze zdalnego MMSC. Nie podając żadnych szczegółów dotyczących połączenia, takich jak zdalny adres URL MMSC, połóż poświadczenia, które są trudne do odtworzenia i podaj poprawkę dla problemu. – Sriram

+0

jak przekazać referencje, a także nie mam żadnych informacji na temat poświadczenia, które należy dostarczyć? –

+1

Najpierw sprawdź, czy możesz uzyskać dostęp do witryny google.com i pomyślnie ją uruchomić w swojej przeglądarce. Następnie możesz przejść do ustawień specjalnych MMS, przechodząc do (Na Androidzie 2.0) Ustawienia-> Sieci komórkowe -> Nazwy punktów dostępu -> Nazwa dostawcy sieci. Tutaj znajdziesz Tabs, takie jak 1.) MMSC 2.) MMS proxy 3.) Port MMS 4.) Nazwa użytkownika 5.) Hasło. – Sriram

Odpowiedz

3

Teraz jestem w stanie znaleźć rozwiązanie, ale uważam, że kiedyś kod pobieranie nie działa, ale kiedy spróbujesz ponownie działa chociaż co mi brakuje pierwszy ustanowienia łączności z serwerem. Podam poniżej metodę łączności, a po tym wywołaniu nazwę metody downloadThroughGateway (parametry), o której mowa w tym kodzie pytającym.

private void startConnectivity() throws Exception { 
     ConnectivityManager mConnMgr = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (!mConnMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS) 
       .isAvailable()) { 
      throw new Exception("Not available yet"); 
     } 
     int count = 0; 
     int result = beginMmsConnectivity(mConnMgr); 
     if (result != PhoneEx.APN_ALREADY_ACTIVE) { 
      NetworkInfo info = mConnMgr 
        .getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS); 
      while (!info.isConnected()) { 
       Thread.sleep(1500); 
       info = mConnMgr 
         .getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS); 
       Log.d(">>>", "Waiting for CONNECTED: state=" + info.getState()); 
       if (count++ > 5) 
        throw new Exception("Failed to connect"); 
      } 
     } 
     Thread.sleep(1500); 
    } 
+0

Skąd pochodzi klasa MmsDecoder? – user1163234

+0

Robię coś podobnego TUTAJ !!! http://stackoverflow.com/questions/21748209/receive-mms-messages-in-android-kitkat – toobsco42