2016-11-17 4 views
0

Для моих собственных целей я хочу отправить файл dex другого приложения на удаленный сервер и получить ответ.Отправить .dex файл через почтовый запрос android studio

Я использовал ответы, которые я нашел здесь. Сначала я попытался создать простой пример, просто подключиться к серверу и загрузить файл dex. Пока мне не удалось извлечь dex из других приложений, поэтому я подумал об использовании файла dex, который у меня уже есть. Как я читал, не общие файлы должны храниться либо в «/ res/raw», либо «assets» Я пробовал много способов загрузить его как файл , но ни один из них не работал. Путь, который я использовал во всех случаях, был найден щелчком правой кнопки мыши по файлу -> ссылка на копию.

  1. создать папку Рез под/сырыми и

    File f = new File("res/raw/filename.dex"); 
    
  2. Создать новую папку активов в/приложение

    File f = new File("filename.dex"); 
    
  3. Создать папку активов в/основной

    File f = new File("main/assets/filename.dex"); 
    

    и так далее.

Единственный способ, которым я сумел сделать это с помощью InputStream

Inputstream in = getResources().openRawResources(R.raw.filename_without_dex) 

, но я не мог бросить его в файл, так что я бросил это solution.I хотят иметь его как Файл вызывает следующий запрос POST, который должен быть multipart/form.

В java способ «загрузить» файл прост. Почему не в андроиде?

+0

Вы не можете открыть его как файл, так как он не существует в виде файла в файловой системе. И последняя часть вашего вопроса не имеет смысла: «Я хочу, чтобы это было как File, потому что следующий запрос POST должен быть многочастным/form». Нет причин, по которым вы не можете этого сделать, прочитав данные из InputStream. – JesusFreke

+0

@JesusFreke Я вижу вашу точку зрения. Я пробовал этот путь [link] (https://developer.android.com/reference/java/net/HttpURLConnection.html), который использует InputStream, и мне не удалось заставить его работать. Не могли бы вы привести пример правильного использования InputStream для getOutputStream()? –

+0

@JesusFreke Причина, по которой я спрашиваю, потому что я нашел много примеров с помощью 'MultipartEntityBuilder' для создания запроса multipart/form-data, который принимает' File', но ни один из них не создает многостраничный запрос POST с использованием 'HttpURLConnection' и' InputStream' классы –

ответ

0

Действительно уродливое, быстрое и грязное решение.
Отсутствие проверки или очистки ошибок.
Но он работает.

import android.content.pm.ApplicationInfo; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.RandomAccessFile; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 
import java.util.zip.ZipInputStream; 

public class MainActivity extends ActionBarActivity { 
    final String TAG = "GetDex"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     getAppPaths(); // to list all packages 

     String s = "/data/app/SoftKeyboard/SoftKeyboard.apk"; // a sample package 
     byte[] b = getFile(s); 
     byte[] dex = unzipDex(b, s); 
     Log.d(TAG, String.format("DEX size is %d", dex.length)); 
    } 





List<String> getAppPaths() { 
    final PackageManager pm = getPackageManager(); 
    //get a list of installed apps. 
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); 
    List<String> paths = new ArrayList<>(); 

    for (ApplicationInfo packageInfo : packages) { 
     Log.d(TAG, "Installed package :" + packageInfo.packageName); 
     Log.d(TAG, "Apk file path:" + packageInfo.sourceDir); 
     paths.add(packageInfo.sourceDir); 
    } 

    return paths; 
} 


byte[] getFile(String filename) { 
    try { 
     RandomAccessFile f = new RandomAccessFile(filename, "r"); 
     byte[] b = new byte[(int)f.length()]; 
     f.readFully(b); 
     return b; 
    } catch(IOException exception) { 
     exception.printStackTrace(); 
    } 

    return null; 
} 

public byte[] unzipDex(byte[] bytes, String filename) { 
    try{ 
     ZipFile zipFile = new ZipFile(filename); 
     ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(bytes)); 
     ZipEntry ze = zis.getNextEntry(); 

     while(ze!=null){ 
      String entryName = ze.getName(); 
      if(!entryName.equals("classes.dex")) { 
       ze = zis.getNextEntry(); 
       continue; 
      } 

      InputStream is = zipFile.getInputStream(ze); 

      ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

      int nRead; 
      byte[] data = new byte[16384]; 

      while ((nRead = is.read(data, 0, data.length)) != -1) { 
       buffer.write(data, 0, nRead); 
      } 

      buffer.flush(); 

      return buffer.toByteArray(); 
     } 
     System.out.println("Done"); 

    }catch(IOException ex){ 
     ex.printStackTrace(); 
    } 

    return null; 
} 

}

+0

Спасибо @ Рой. Хотя это не самое подходящее решение, это помогло мне понять –