2011-10-07 5 views
22

thể trùng lặp:
Supporting Amazon and Android market links inside applicationLàm thế nào để hỗ trợ Amazon và Android Market (Google Play) liên kết trong cùng APK

Tôi đã tự hỏi nếu và làm thế nào bạn có thể phân biệt giữa một Amazon App Store ứng dụng đã cài đặt và một ứng dụng được cài đặt từ Market.

Ví dụ: giả sử tôi có ứng dụng được gọi là "Ứng dụng mẫu" và tôi muốn phát triển cho Amazon và Market. Trong ứng dụng tôi có liên kết để xếp hạng Ứng dụng mẫu. Tôi cũng có một liên kết để mua Example App Pro. Điều này đặt ra một vấn đề bởi vì Amazon sẽ không phát hành ứng dụng của tôi nếu nó liên kết đến một cửa hàng ứng dụng khác.

Điều này yêu cầu tôi tạo 2 tệp APK, đó là một nỗi đau. Nó chỉ mất thêm khoảng 30 giây để xuất cả hai, nhưng nó tạo ra thêm lộn xộn và thời gian thử nghiệm. Vì vậy, bất kỳ ai cũng tìm thấy một cách để tạo một APK đơn lẻ có thể tải lên cả Amazon và Android Market mà không thực hiện bất kỳ thay đổi nào giữa cả hai để có thể kiểm tra xem Amazon hoặc Market đã cài đặt nó hay chưa. và thay đổi các liên kết cho phù hợp?

+0

Điều này thực sự thú vị và hữu ích. Tuy nhiên, tôi nghĩ bạn cần tách nó thành câu trả lời và câu hỏi (trả lời câu hỏi của riêng bạn) để đáp ứng Câu hỏi thường gặp về ngăn xếp ngăn xếp. Đầu tiên, nêu rõ câu hỏi, sau đó tự trả lời câu hỏi. – haimg

+0

@haimg Đã cập nhật. :) – Jakar

+0

Có vẻ tốt! (+1) – haimg

Trả lời

17

Chỉnh sửa: Tại thời điểm bài đăng này, tôi không biết về điều đó, nhưng có tồn tại getInstallerPackageName() nhưng tôi không chắc là đáng tin cậy như thế nào. Tôi cũng không chắc những gì nó trả về cho Amazon/Market, vv Nó có thể đáng xem, nhưng nếu nó không hoạt động, thì phương thức dưới đây hoạt động cho Google vs Amazon.

Bạn sẽ phải ký ứng dụng như bình thường, chạy trên thiết bị thử nghiệm của bạn, nhận giá trị sig.hashCode() từ nhật ký của bạn, sau đó thay thế -1545485543 bằng bất kỳ giá trị nào bạn nhận được cho sig.hashCode() rồi xuất và đăng nhập lại một lần nữa (VỚI KHU CÙNG TRƯỚC KHI TRƯỚC) và sau đó tải lên Amazon và Market cả hai - từ cùng một APK.

Do đó:

public static boolean isMarket(Context context){ 
    boolean isMarketSig = false; 
    int currentSig = 1; // I just set this to 1 to avoid any exceptions later on. 
    try { 
     Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; 
     for (Signature sig : sigs) 
     { 
      currentSig = sig.hashCode(); 


    Log.i("MyApp", "Signature hashcode : " + sig.hashCode()); 
// This Log is for first time testing so you can find out what the int value of your signature is. 
      } 
      } catch (Exception e){ 
       e.printStackTrace(); 


} 
//-1545485543 was the int I got from the log line above, so I compare the current signature hashCode value with that value to determine if it's market or not. 
     if (currentSig==-1545485543){ 
      isMarketSig = true; 
    } else { 
     isMarketSig = false; 
    } 

    return isMarketSig; 
} 
public static void openStore(Context context){ 
    if (isMarket(context)){ 
     Intent goToMarket = new Intent(Intent.ACTION_VIEW,Uri.parse("market://d" + 
     "etails?id=com.jakar.myapp")); 
     goToMarket.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(goToMarket); 
    } else { 
     Intent goToAppstore = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.amazon.com/gp/mas/dl/andro" + 
     "id?p=com.jakar.myapp")); 
     goToAppstore.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(goToAppstore); 
    } 
} 

Về cơ bản, hashCode() mà bạn nhận được từ các ứng dụng được cài đặt trên thiết bị thử nghiệm của bạn sẽ giống một từ thị trường. Mã băm từ cửa hàng ứng dụng sẽ khác nhau vì theo https://developer.amazon.com/help/faq.html, cửa hàng ứng dụng ký tên ứng dụng có chữ ký cụ thể cho tài khoản nhà phát triển của bạn, do đó sẽ trả lại giá trị khác với những gì bạn thực sự đã ký.

Và tôi đặt phương thức isMarket và openStore trong một lớp khác được gọi là OtherClass để tôi chỉ phải mã hóa nó một lần. Sau đó, từ bất kỳ hoạt động nào mà tôi cần mở liên kết thích hợp, tôi chỉ gọi cho OtherClass.openStore (ngữ cảnh);

Lưu ý: Nó hoạt động để mở thị trường thành công, nhưng tôi chưa triển khai phương pháp này trên App Store, vì vậy tôi chưa hoàn toàn kiểm tra nó. Tôi tin tưởng nó sẽ hoạt động, nhưng có thể không đảm bảo, vì vậy nếu bạn sử dụng những gì tôi đã đề nghị và nó không thành công, xin vui lòng không giữ cho tôi trách nhiệm.

This là một trợ giúp lớn trong việc đưa ra câu trả lời để tôi có thể kiểm tra chữ ký nào đang được sử dụng.

+0

Công cụ tuyệt vời Jakar, cảm ơn.Câu hỏi, khi bạn lấy chữ ký của bạn, bạn lưu nó trong một 'Chữ ký []'. Sau đó, bạn so sánh chữ ký cuối cùng trong mảng với bất kỳ mã băm nào bạn đã xác định trước đó. Điều đó có nghĩa là bạn cho rằng gói được ký chỉ với một chứng chỉ. Đây không phải là một vấn đề vì đây thường là trường hợp, chỉ thấy nó thú vị vì gần đây tôi đã học được bạn có thể ký APK với nhiều hơn một cert. Điều kỳ lạ là Amazon cũng sẽ chấp nhận các APK đã ký, vì vậy khi họ ký hợp đồng với riêng mình, sẽ có hai chứng chỉ. Điều này có thể dẫn đến dương tính giả trong séc của bạn không? –

+0

Tôi thực sự không biết. Tôi nghĩ rằng Amazon thực sự về cơ bản unpacks nó, mà loại bỏ chữ ký của riêng bạn, và sau đó họ đăng nhập lại. Nếu nó chứa nhiều hơn một chữ ký sau khi Amazon ký nó, tôi đoán rằng có thể làm cho nó khó hơn một chút, nhưng bạn luôn có thể so sánh mọi mục nhập trong mảng và nếu một trong số chúng! = YourSig, sau đó sử dụng liên kết Amazon. – Jakar

+0

@Jakar Bạn đã thử nghiệm điều này trên một ứng dụng được xuất bản cho cả thị trường của Google và Amazon? – CrackerJack9