2016-08-18 1 views
0

Есть ли способ сделать операцию API Dropbox, которую я могу вызвать из других классов? У меня есть раздел загрузки и вместо того, чтобы переписывать код в каждом классе, я могу поместить его в свой собственный класс, а затем вызвать этот класс, когда мне это нужно?Как я могу скрыть свои ключи apbox Dropbox

Также есть способ скрыть свой Dropbox Ключи API?

Вот как я установил API на данный момент. Должен быть более безопасный способ, поскольку я не хочу, чтобы мои данные показывались.

public static String APP_TYPE ="/FOLDER -- LOCATION-- FOR--DOWNLOADS"; 
public static String path = Environment.getExternalStorageDirectory().getAbsolutePath() + APP_TYPE; 
public static File Dir = new File (path); 
AndroidAuthSession session = buildSession(); 

static DropboxAPI<AndroidAuthSession> dropboxAPI; 
private final String APP_KEY = "MY -- KEY"; 
private final String APP_ACCESS = "MY -- PASSWORD"; 
private final String TOKEN = "MY -- ACCESS -- TOKEN"; 

Тогда в моем OnCreate

Dir.mkdir(); 

     dropboxAPI = new DropboxAPI<AndroidAuthSession>(session); 

Я называю это с моим по щелчку команды.

DownloadFromDropboxFromPath(path + "downloadFileFromDropbox", +APP_TYPE +"MY.apk"); 

Наконец, это фактический способ, которым я называю API.

private AndroidAuthSession buildSession() { 
    AppKeyPair appKeyPair = new AppKeyPair(APP_KEY, APP_ACCESS); 
    AndroidAuthSession session = new AndroidAuthSession(appKeyPair); 
    session.setOAuth2AccessToken(TOKEN); 
    return session; 
} 

static final int UploadFromSelectApp = 9501; 
static final int UploadFromFilemanager = 9502; 
public static String DropboxUploadPathFrom = ""; 
public static String DropboxUploadName = ""; 
public static String DropboxDownloadPathFrom = ""; 
public static String DropboxDownloadPathTo = ""; 

private void UploadToDropboxFromPath(String uploadPathFrom, String uploadPathTo) { 
    Toast.makeText(getApplicationContext(), "Upload file ...", Toast.LENGTH_SHORT).show(); 
    final String uploadPathF = uploadPathFrom; 
    final String uploadPathT = uploadPathTo; 
    Thread th = new Thread(new Runnable() { 
     public void run() { 
      File tmpFile = null; 
      try { 
       tmpFile = new File(uploadPathF); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      FileInputStream fis = null; 
      try { 
       fis = new FileInputStream(tmpFile); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      try { 
       dropboxAPI.putFileOverwrite(uploadPathT, fis, tmpFile.length(), null); 
      } catch (Exception e) { 
      } 
      getMain().runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(getApplicationContext(), "File successfully uploaded.", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    }); 
    th.start(); 
} 

private void DownloadFromDropboxFromPath(String downloadPathTo, final String downloadPathFrom) { 
    DropboxDownloadPathTo = downloadPathTo; 
    DropboxDownloadPathFrom = downloadPathFrom; 

    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      Toast.makeText(getApplicationContext(), "Downloading Please wait ...", Toast.LENGTH_LONG).show(); 
      Thread th = new Thread(new Runnable() { 
       public void run() { 
        final File file = new File(DropboxDownloadPathTo + DropboxDownloadPathFrom.substring(DropboxDownloadPathFrom.lastIndexOf('.'))); 
        if (file.exists()) file.delete(); 

        try { 
         FileOutputStream outputStream = new FileOutputStream(file); 
         castingapplistview.dropboxAPI.getFile(DropboxDownloadPathFrom, null, outputStream, null); 
         getMain().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           Toast.makeText(getApplicationContext(), "File successfully downloaded.", Toast.LENGTH_SHORT).show(); 
           showInterstitial(); 

           Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(file), 
             "application/vnd.android.package-archive"); 
           promptInstall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

           startActivity(promptInstall); 
          } 
         }); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 

       } 
      }); 
      th.start(); 
     } 
    }); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    if (requestCode == UploadFromFilemanager) { 
     final Uri currFileURI = intent.getData(); 
     final String pathFrom = currFileURI.getPath(); 
     Toast.makeText(getApplicationContext(), "Upload file ...", Toast.LENGTH_SHORT).show(); 
     Thread th = new Thread(new Runnable() { 
      public void run() { 
       getMain().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         UploadToDropboxFromPath(pathFrom, "/db-test/" + DropboxUploadName + pathFrom.substring(pathFrom.lastIndexOf('.'))); 
         Toast.makeText(getApplicationContext(), "File successfully uploaded.", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 
     }); 
     th.start(); 
    } 
    if (requestCode == UploadFromSelectApp) { 
     Toast.makeText(getApplicationContext(), "Upload file ...", Toast.LENGTH_SHORT).show(); 
     final Uri uri = intent.getData(); 

     DropboxUploadPathFrom = getPath(getApplicationContext(), uri); 
     if (DropboxUploadPathFrom == null) { 
      DropboxUploadPathFrom = uri.getPath(); 
     } 
     Thread th = new Thread(new Runnable() { 
      public void run() { 
       try { 
        final File file = new File(DropboxUploadPathFrom); 
        InputStream inputStream = getContentResolver().openInputStream(uri); 

        dropboxAPI.putFile("/db-test/" + DropboxUploadName + file.getName().substring(file.getName().lastIndexOf("."), 
          file.getName().length()), inputStream, file.length(), null, new ProgressListener() { 
         @Override 
         public long progressInterval() { 
          return 100; 
         } 

         @Override 
         public void onProgress(long arg0, long arg1) { 
         } 
        }); 
        getMain().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getApplicationContext(), "File successfully uploaded.", Toast.LENGTH_SHORT).show(); 
         } 
        }); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     th.start(); 
    } 
    super.onActivityResult(requestCode, resultCode, intent); 
} 

public String getPath(Context context, Uri contentUri) { 
    Cursor cursor = null; 
    try { 
     String[] proj = {MediaStore.Images.Media.DATA, MediaStore.Video.Media.DATA, MediaStore.Audio.Media.DATA}; 
     cursor = context.getContentResolver().query(contentUri, proj, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     String s = cursor.getString(column_index); 
     if (s != null) { 
      cursor.close(); 
      return s; 
     } 
    } catch (Exception e) { 
    } 
    try { 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
     cursor.moveToFirst(); 
     String s = cursor.getString(column_index); 
     if (s != null) { 
      cursor.close(); 
      return s; 
     } 
    } catch (Exception e) { 
    } 
    try { 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
     cursor.moveToFirst(); 
     String s = cursor.getString(column_index); 
     cursor.close(); 
     return s; 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
} 

public castingapplistview getMain() { 
    return this; 
     } 

    } 

На данный момент у меня есть весь этот код в каждом действии, использующем API Dropbox. Наверняка, я могу сделать это в своем классе, убедившись, что я спрячу ключи? Спасибо, как всегда.

+1

уверен, но они 2 разные вещи, один, сделать вспомогательный класс для Dropbox API, два зашифровать ключ, чтобы скрыть его –

+0

любые идеи о том, как сделать это будет значительно aprreciated @JordiCastilla –

+1

начало здесь http://stackoverflow.com/documentation/java/1889/rsa-encryption#t=201608181313048028754 о слиянии с более простым классом, это больше проблема дизайна, я думаю, что вы можете легко решить –

ответ

1

Есть ли способ сделать деятельность API Dropbox, которую я могу вызвать из других классов? У меня есть раздел загрузки и вместо того, чтобы переписывать код в каждом классе, я могу поместить его в свой собственный класс, а затем вызвать этот класс, когда мне это нужно?

Да. Вы можете сделать суперкласс с этими константами и расширяться всякий раз, когда вам нужно.

Также есть способ скрыть ключи API Dropbox?

Да, вы можете поместить их в build.gradle (модуль: приложение)

android { 
    ... 

    defaultConfig { 
     ... 
    } 

    buildTypes { 
     release { 
     ... 
    } 

    buildTypes.each { 
     it.buildConfigField 'String', 'MY_API_TOKEN_KEY', MyApiTokenValue 
    } 
} 

И использовать их на вашей деятельности (или любого класса Java), просто используйте:

BuildConfig.MY_API_TOKEN_KEY 

Вы можете видеть, как работает this repository.

+0

благодаря тому, что лучше, чем они находятся в классе файлы –

+0

Я рекомендую прочитать ответ WIllJBD. Короче говоря, невозможно по-настоящему защитить секрет, как токен доступа в клиентском приложении, поэтому встраивание его таким образом не рекомендуется. – Greg

2

Ответ отрицательный. Невозможно полностью скрыть свои ключи в приложении. Вы можете скрыть их из репозитория, но с кем-то, у которого есть ваш файл .apk, гораздо труднее скрыть. Кто-то определил достаточно, получит их. При этом существует ряд способов сделать это сложным, в том числе с использованием NDK и JNI, иметь функцию, которая вернет ваш ключ, учитывая, что вызов приложения обеспечивает правильные подписи приложений, вы можете сделать больше, чем просто запутывать c/C++.

Любой, кто может декомпилировать приложение, которое есть кто угодно, может получить ваш ключ. Помещая это в файлы градиента, он не будет защищен от людей, которые этого хотят. Он скомпилируется в класс java, который даже при запутывании может быть найден.

Вот достойная статья, которая поможет вам на вашем пути.

http://www.informit.com/articles/article.aspx?p=2268753&seqNum=4

Смежные вопросы