从targetSdkVersion 21更改为targetSdkVersion 26时发生错误

时间:2018-08-07 06:46:05

标签: android target-sdk

最近我从targetSdkVersion 26更改为targetSdkVersion 21。 这样做会出现几个问题。

  1. 我已经编写了一个类并运行,但是去了 抛出新的RuntimeException(e)

    代码如下

    package com.xxxxxxxxxx.android.webapp.util;
    
    import android.content.Context;
    import android.telephony.TelephonyManager;
    
    import com.xxxxxxxxxx.android.webapp.BuildConfig;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    
    public class Installation {
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";
    
    public synchronized static String id(Context context) {
        if (sID == null) {
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation,context);
                sID = readInstallationFile(installation,context);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }
    
    private static String readInstallationFile(File installation,Context context) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }
    
    private static void writeInstallationFile(File installation,Context context) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = getUniqueID(context);   //UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
    
    private static String getUniqueID(Context context){
        String android_id = android.provider.Settings.Secure.getString(
                context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
    
        String eid = null;
        try {
            eid = Encryptor.encrypt("gignoGawaAppli", android_id );
    
            if (BuildConfig.uidEncryptionMd5) {
                eid = md5(eid);
            }
    
        }catch (Exception e){};
        return eid;
    }
    
    public static String md5(String s) {
        try {
            // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();
    
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < messageDigest.length; i++) {
                if ((0xff & messageDigest[i]) < 0x10) {
                    hexString.append("0" + Integer.toHexString((0xFF & messageDigest[i])));
                } else {
                    hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
                }
            }
            return hexString.toString();
    
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
    
    }
    

像这样出现在控制台上

  

原因:java.lang.RuntimeException:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法byte [] java.lang.String.getBytes()

  1. 不能获得 ANDROID_ID

    当我的项目targetSdkVersion's 21一切正常时。

请非常感谢您。

2 个答案:

答案 0 :(得分:0)

可能是您不提供运行时权限的问题。Here is the tutorial

答案 1 :(得分:0)

  

「由:java.lang.RuntimeException:   java.lang.NullPointerException:尝试调用虚拟方法   '空对象引用上的'byte [] java.lang.String.getBytes()'”

这是因为下面的代码

String id = getUniqueID(context);   //UUID.randomUUID().toString(); 

返回一个空指针,这意味着方法getUniqueID没有正确执行。您需要调试此方法以获取更多详细信息。