2011-11-06 11 views
28

Trong ứng dụng Android của tôi, tôi muốn nhắc người dùng tại một số thời điểm để xếp hạng ứng dụng trong thị trường Android.Nhắc người dùng xếp hạng ứng dụng Android bên trong Ứng dụng

Đã tìm kiếm một cách tiếp cận, tôi đã tìm thấy một số mã on this website. Mã này dường như hoạt động rất tốt.

Nhưng thật không may, mã này dường như làm tăng thông báo lỗi "Buộc đóng" khi Android Market chưa được cài đặt trên điện thoại của người dùng. Có cách nào để kiểm tra xem thị trường Android có được cài đặt hay không, nếu không, đừng cố thực thi mã?

Dòng làm nảy sinh các lỗi có lẽ là một điều này vì nó không thể phân tích URI:

mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME))); 

Và, bằng cách này, là có bất kỳ những thứ khác mà có thể được cải thiện trong mã đó?

Edit:

Một vài năm sau đó, tôi đã đặt tất cả các mã vào một dự án thư viện nhỏ: AppRater on GitHub

+0

là nó có thể để kiểm tra thư viện của bạn trước khi phát hành của ứng dụng trên playstore? Hoặc nó phải có mặt trên cửa hàng để popup được hiển thị? –

+1

@StackDiego Chỉ cần lấy JAR mới nhất từ ​​dự án GitHub và gọi 'demo()' thay vì 'show()' :) Cảm ơn bạn đã phản hồi! – caw

+0

Cảm ơn bạn, tôi sẽ thử ngay bây giờ –

Trả lời

14

Bạn luôn có thể gọi getInstalledPackages() từ lớp PackageManager và kiểm tra đảm bảo lớp thị trường được cài đặt. Bạn cũng có thể sử dụng queryIntentActivities() để đảm bảo rằng Intent bạn xây dựng sẽ có thể được xử lý bởi một cái gì đó, ngay cả khi nó không phải là ứng dụng thị trường. Đây có lẽ là điều tốt nhất để làm thực sự vì nó linh hoạt và mạnh mẽ nhất.

+0

Cảm ơn bạn! Đây là chính xác những gì tôi đang tìm kiếm :) – caw

0

Nếu ứng dụng đã được tải về thông qua Android Market, người dùng sẽ phải cài đặt Android Market trên điện thoại, vì vậy tôi thực sự không thấy điều này như là một vấn đề. Có vẻ như rất lạ ...

Bạn có thể sử dụng sau đây để khởi động Android Market trên trang ứng dụng của bạn, đó là một chút tự động:

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.parse("market://details?id=" + getPackageName())); 
startActivity(i); 
+0

Mã bạn đã đăng hoạt động, nhưng mã được hiển thị trong liên kết ở trên ngắn hơn - chỉ một dòng duy nhất để bắt đầu ý định. Và: Tất nhiên, có khả năng người dùng không có ứng dụng Android Market: Họ tải xuống ứng dụng của tôi thông qua thị trường Android và sau đó (một lúc nào đó) xóa ứng dụng Android market khỏi điện thoại của họ;) – caw

+0

Tại sao họ lại muốn làm điều đó? Nó có vẻ vô cùng ngu ngốc. Chắc chắn không phải thứ bạn là nhà phát triển nên quan tâm. Nhưng nếu bạn nhấn mạnh, bạn có thể làm những gì Kurtis đang gợi ý. Kiểm tra xem ứng dụng đã được cài đặt chưa. Bạn cũng có thể làm như sau: http://stackoverflow.com/questions/4439043/what-is-the-package-name-of-the-android-market-or-google-apps và kiểm tra xem nó có trả lại ứng dụng hay không. –

+1

Cảm ơn bạn. Nó có thể là "ngu ngốc" nhưng có thể, tuy nhiên. Phương thức getPackageName() là một cách hay để tránh mã hóa cứng tên gói. Nhưng kể từ khi lớp học (xem liên kết) là trong một lớp học bên ngoài tôi không thể sử dụng nó. – caw

1

Không phải tất cả thiết bị Android đều sử dụng thị trường ứng dụng. Kindle và Nook có thị trường riêng của họ nên cần mã để kiểm tra xem thị trường có tồn tại hay không. Mặc dù phải có cách để gửi xếp hạng đến đúng thị trường, bất kể nó là cái gì. Một cái gì đó để xem xét.

+1

Điều này không thực sự là một vấn đề anyways, xem xét rằng Nook và Amazon thị trường có một quá trình nộp nơi các liên kết này luôn được kiểm tra. Bạn sẽ không bao giờ nhận được một ứng dụng được chấp nhận để được xuất bản ở một trong những thị trường có liên kết tỷ lệ tới google, do đó, lực lượng đóng sẽ không phải là vấn đề, bạn sẽ phải làm lại mã tỷ lệ cụ thể cho thị trường. –

36

Dưới đây là tất cả các mã bạn cần, (sự kết của câu trả lời và thông tin suy ra của Kurt, cộng với liên kết và câu hỏi):

/* This code assumes you are inside an activity */ 
final Uri uri = Uri.parse("market://details?id=" + getApplicationContext().getPackageName()); 
final Intent rateAppIntent = new Intent(Intent.ACTION_VIEW, uri); 

if (getPackageManager().queryIntentActivities(rateAppIntent, 0).size() > 0) 
{ 
    startActivity(rateAppIntent); 
} 
else 
{ 
    /* handle your error case: the device has no way to handle market urls */ 
} 
+0

Hoàn hảo :-) Yêu cách tiếp cận. Điều này sẽ hoạt động khi ứng dụng được phát hành trong cửa hàng – Nabin

9

Bạn cũng có thể sử dụng RateMeMaybe: https://github.com/Kopfgeldjaeger/RateMeMaybe

Nó mang đến cho bạn một số tùy chọn để định cấu hình (tối thiểu ngày/lần khởi chạy cho đến khi lời nhắc đầu tiên, tối thiểu ngày/lần khởi chạy cho đến mỗi lời nhắc tiếp theo nếu người dùng chọn "không phải bây giờ", tiêu đề hộp thoại, tin nhắn, v.v.). Nó cũng dễ sử dụng.

Ví dụ sử dụng từ README:

RateMeMaybe rmm = new RateMeMaybe(this); 
rmm.setPromptMinimums(10, 14, 10, 30); 
rmm.setDialogMessage("You really seem to like this app, " 
       +"since you have already used it %totalLaunchCount% times! " 
       +"It would be great if you took a moment to rate it."); 
rmm.setDialogTitle("Rate this app"); 
rmm.setPositiveBtn("Yeeha!"); 
rmm.run(); 
+1

Giả sử nếu tôi thực thi mã trong onCreate hoạt động đầu tiên của tôi thì nó sẽ hiển thị hộp thoại cho người dùng? Bởi vì mọi lúc tôi gọi phương thức RateMeMaybe để hiển thị hộp thoại sau 14 ngày. Đúng? – keen

0

Khi tôi sử dụng "thị trường: // details? Id =?" + GetApplicationContext() getPackageName() nó sẽ mở ra thị trường mobogenie trên tôi, vì vậy tôi thích sử dụng https://play.google.com/store/apps/details?id=. "+ getApplicationContext(). getPackageName()

+0

Điều này chỉ có nghĩa là thị trường thay thế của bạn cho biết nó cũng có thể xử lý 'URL: // 'URL. Và có thể bạn đã chọn ứng dụng này làm mặc định trên điện thoại của mình. – caw

+0

hm có thể được, tôi đã thử nó trên giả lập. –

1

mã đơn giản này sẽ đạt được những gì bạn muốn, không cần phải cho các thư viện bên ngoài hoặc bất cứ điều gì lạ mắt. Chỉ cần đặt nó vào sự kiện OnCreate trên hoạt động chính của bạn. Biến RunEvery sẽ xác định tần suất thông báo tốc độ sẽ xuất hiện. Trong ví dụ được đặt thành 10.

// Count times app has been opened, display rating message after number of times 
// By Rafael Duval 
    try { 

     // Get the app's shared preferences 
     SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(this); 

     // Get the value for the run counter 
     int counter = app_preferences.getInt("counter", 0); 

     // Do every x times 
     int RunEvery = 10; 

     if(counter != 0 && counter % RunEvery == 0) 
     { 
      //Toast.makeText(this, "This app has been started " + counter + " times.", Toast.LENGTH_SHORT).show(); 

      AlertDialog.Builder alert = new AlertDialog.Builder(
        MyActivity.this); 
        alert.setTitle("Please rate"); 
        alert.setIcon(R.drawable.ic_launcher); //app icon here 
        alert.setMessage("Thanks for using this free app. Please take a moment to rate it."); 

        alert.setPositiveButton("Cancel", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, 
         int whichButton) {        
          //Do nothing 
         } 
        }); 

        alert.setNegativeButton("Rate it", 
        new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int which) { 

          final String appName = getApplicationContext().getPackageName(); 
          try { 
          startActivity(new Intent(Intent.ACTION_VIEW, 
           Uri.parse("market://details?id=" 
           + appName))); 
          } catch (android.content.ActivityNotFoundException anfe) { 
          startActivity(new Intent(
           Intent.ACTION_VIEW, 
           Uri.parse("http://play.google.com/store/apps/details?id=" 
           + appName))); 
          } 

         } 
        }); 
        alert.show();    
     } 


     // Increment the counter 
     SharedPreferences.Editor editor = app_preferences.edit(); 
     editor.putInt("counter", ++counter); 
     editor.commit(); // Very important   

    } catch (Exception e) { 
     //Do nothing, don't run but don't break 
    }   
5

Trước tiên, bạn cần tính số lần sử dụng;

SharedPreferences preferences = getSharedPreferences("progress", MODE_PRIVATE); 
int appUsedCount = preferences.getInt("appUsedCount",0); 
appUsedCount++; 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putInt("appUsedCount", appUsedCount); 
editor.apply(); 

if (appUsedCount==10 || appUsedCount==50 || appUsedCount==100 || appUsedCount==200 || appUsedCount==300){ 
    AskForRating(appUsedCount); 
} else { 
    finish(); 
} 

Hơn bạn có thể nhắc như thế này;

private void AskForRating(int _appUsedCount){ 

    AlertDialog.Builder alert = new AlertDialog.Builder(this); 
    alert.setTitle("Please Rate Us"); 
    alert.setIcon(R.drawable.book); 
    alert.setMessage("Thanks for using the application. If you like YOUR APP NAME please rate us! Your feedback is important for us!"); 
    alert.setPositiveButton("Rate it",new Dialog.OnClickListener(){ 
     public void onClick(DialogInterface dialog, int whichButton){ 
      String url = "https://play.google.com/store/apps/details?id=YOUR PACKAGE NAME"; 
      Intent i = new Intent(Intent.ACTION_VIEW); 
      i.setData(Uri.parse(url)); 
      startActivity(i); 
     } 
    }); 
    alert.setNegativeButton("Not now", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      finish(); 
     } 
    }); 
    alert.show(); 
} 
+0

Sự khác biệt ở đây là nó sẽ đưa bạn đến trang web thông qua trình duyệt thay vì sử dụng ứng dụng cửa hàng Play. Trước tiên, bạn nên kiểm tra xem việc sử dụng ứng dụng cửa hàng Play có thể không sau đó sử dụng trình duyệt để truy cập trang web. – xxx

0

sử dụng mã này

Uri uri = Uri.parse("market://details?id=" + context.getPackageName()); 
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); 
// To count with Play market backstack, After pressing back button, 
// to taken back to our application, we need to add following flags to intent. 
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | 
       Intent.FLAG_ACTIVITY_NEW_DOCUMENT | 
       Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 
try { 
    startActivity(goToMarket); 
} catch (ActivityNotFoundException e) { 
    startActivity(new Intent(Intent.ACTION_VIEW, 
      Uri.parse("http://play.google.com/store/apps/details?id=" + context.getPackageName()))); 
}