2016-11-17 7 views
0

私自身の目的のために、私は他のアプリのdexファイルをリモートサーバに送信して回答を得たいと思います。投稿リクエストを介して.dexファイルを送信アンドロイドスタジオ

ここで私が見つけた回答を使用しました。私は最初に簡単な例を作成しようとしましたが、サーバーに接続してdexファイルをアップロードするだけでした。これまで私は他のアプリからdexを抽出することはできませんでしたので、私はすでに持っているdexファイルを使うことを考えました。 私が読んだところでは、一般的なファイルは "/ res/raw"または "assets"のいずれにも格納されません ファイルとしてロードする方法はいくつかありましたが、すべての場合に使用されたパスは、ファイル - >コピー参照を右クリックして見つかりました。

File f = new File("res/raw/filename.dex"); 
  • は/アプリ

    File f = new File("filename.dex"); 
    
  • 資産のフォルダを作成します下に新しい資産フォルダを作成/生下と

    1. RESフォルダを作成/メイン

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

      など。

    私がそうすることを管理する唯一の方法は、入力ストリーム

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

    を使用することですが、私はそれをファイルにキャストすることができませんでしたので、私はこのsolution.Iがとしてそれを持ってしたいドロップファイルは、次のPOST要求が複数パート/フォームでなければならないためです。

    Javaでは、ファイルを「ロードする」方法は簡単です。なぜアンドロイド?

  • +0

    、それはファイルシステム上のファイルとして存在していないので、あなたはファイルとして開くことができません。あなたの質問の最後の部分は意味をなさない: "私はファイルとしてそれを持っているため、次のPOST要求はマルチパート/フォームでなければなりません"。 InputStreamからデータを読み込むことでこれを行うことはできません。 – JesusFreke

    +0

    @JesusFreke私はあなたのポイントを見ます。私はInputStreamを使用するこの方法[リンク](https://developer.android.com/reference/java/net/HttpURLConnection.html)を試しましたが、それを動作させることはできませんでした。 InputStreamをgetOutputStream()に適切に使用する例を挙げることができますか? –

    +0

    @JesusFreke私が尋ねる理由は、 'MultipartEntityBuilder'を使って' File'を取るmultipart/form-dataリクエストを作成する例がたくさんありますが、 'HttpURLConnection'と' InputStream'を使ってmultipart POSTリクエストを作成する例はありませんクラス –

    答えて

    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

    ありがとう@ロイ。最も適切な解決策ではありませんが、 –

    関連する問題