2012-01-14 134 views
3

我有一个应用程序,我试图添加谷歌授权而不是版权保护。没有服务器/服务可用的Android授权检查

我的问题是: 当设备可以连接没有问题,如果有许可证,则授予访问权限。如果设备可以连接并且没有许可证,则拒绝访问。

但是当设备由于飞行​​模式,死区等而无法连接时,应用程序会给出未获得许可的响应。

这里是我的代码: package“package name”;

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.Settings.Secure; 
import android.widget.Toast; 

import com.android.vending.licensing.AESObfuscator; 
import com.android.vending.licensing.LicenseChecker; 
import com.android.vending.licensing.LicenseCheckerCallback; 
import com.android.vending.licensing.ServerManagedPolicy; 


public class LicenseCheck extends Activity { 
    private class MyLicenseCheckerCallback implements LicenseCheckerCallback { 

     @Override 
     public void allow() { 
      if (isFinishing()) { 
       // Don't update UI if Activity is finishing. 
       return; 
      } 
      // Should allow user access. 
      startMainActivity(); 

     } 


     @Override 
     public void applicationError(ApplicationErrorCode errorCode) { 
      if (isFinishing()) { 
       // Don't update UI if Activity is finishing. 
       return; 
      } 
      // This is a polite way of saying the developer made a mistake 
      // while setting up or calling the license checker library. 
      // Please examine the error code and fix the error. 
      toast("Error: " + errorCode.name()); 
      startMainActivity(); 

     } 

     @Override 
     public void dontAllow() { 
      if (isFinishing()) { 
       // Don't update UI if Activity is finishing. 
       return; 
      } 

      // Should not allow access. In most cases, the app should assume 
      // the user has access unless it encounters this. If it does, 
      // the app should inform the user of their unlicensed ways 
      // and then either shut down the app or limit the user to a 
      // restricted set of features. 
      // In this example, we show a dialog that takes the user to Market. 
      showDialog(0); 
     } 
    } 



    private static final String BASE64_PUBLIC_KEY =  "MY KEY"; 

private static final byte[] SALT = new byte[] { "20 RANDOM INTEGERS" }; 
private LicenseChecker mChecker; 

// A handler on the UI thread. 

private LicenseCheckerCallback mLicenseCheckerCallback; 

private void doCheck() { 

    mChecker.checkAccess(mLicenseCheckerCallback); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Try to use more data here. ANDROID_ID is a single point of attack. 
    String deviceId = Secure.getString(getContentResolver(), 
      Secure.ANDROID_ID); 

    // Library calls this when it's done. 
    mLicenseCheckerCallback = new MyLicenseCheckerCallback(); 
    // Construct the LicenseChecker with a policy. 
    mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, 
      new AESObfuscator(SALT, getPackageName(), deviceId)), 
      BASE64_PUBLIC_KEY); 
    doCheck(); 

} 

@Override 
protected Dialog onCreateDialog(int id) { 
    // We have only one dialog. 
    return new AlertDialog.Builder(this) 
      .setTitle("Application Not Licensed") 
      .setCancelable(false) 
      .setMessage(
        "This application is not licensed. Please purchase it from the Android Market") 
      .setPositiveButton("Buy App", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, 
           int which) { 
          Intent marketIntent = new Intent(
            Intent.ACTION_VIEW, 
            Uri.parse("http://market.android.com/details?id=" 
              + getPackageName())); 
          startActivity(marketIntent); 
          finish(); 
         } 
        }) 
      .setNegativeButton("Exit", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, 
           int which) { 
          finish(); 
         } 
        }).create(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mChecker.onDestroy(); 
} 

private void startMainActivity() { 
    startActivity(new Intent(this, MY_Activity.class)); 
    finish(); 
} 

public void toast(String string) { 
    Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); 
} 

} 

我甚至愿意只阻止访问,如果它只是回来没有牌照。 我宁愿每次运行应用程序时检查服务器是否可用。 即使我可以运行检查,看看它是否可以到达服务器并从那里去。

回答

1

我找到了解决办法。我没有找到解决办法。经过详尽研究后,我发现默认情况下,如果没有连接或飞行模式,许可证检查会自动默认为NOT_LICENSED。

我所做的是检查连接性。如果有连接,它将运行许可证检查。如果没有连接,它只是进入主要活动。

1

您可能正在使用LVL库的测试帐户。使用Google Test帐户时,许可证仅在分钟到达后有效1分钟,任何进一步的许可证检查都需要网络访问才能返回有效的回复。使用购买该应用程序的真实账户,有效的许可证响应将被缓存数天(假设您使用ServerManagedPolicy)。

0
public void dontAllow(int policyReason) { 

    if (isFinishing()) { 
     // Don't update UI if Activity is finishing. 
     return; 
    } 

    if (policyReason == Policy.RETRY) { 
     //-- no connection (unable to validate license). 
    } else { 
     //-- no license (application is not licensed). 
    } 

    showDialog(0); 
}