/* 
standard MessageDigest algorithms: 
MD5 
SHA-1 
SHA-256 
 */  
private String getCertificateFingerprint(Context mContext, String algorithm, String packageName) {  
    PackageManager pm = mContext.getPackageManager();  
    int flags = PackageManager.GET_SIGNATURES;  
    PackageInfo packageInfo = null;  
    try {  
        packageInfo = pm.getPackageInfo(packageName, flags);  
    } catch (PackageManager.NameNotFoundException e) {  
        e.printStackTrace();  
    }  
  
    if (packageInfo == null)  
        return null;  
  
    Signature[] signatures = packageInfo.signatures;  
    //此处我直接默认只有一个签名  
    byte[] cert = signatures[0].toByteArray();  
    InputStream input = new ByteArrayInputStream(cert);  
    CertificateFactory cf = null;  
    try {  
        cf = CertificateFactory.getInstance("X509");  
    } catch (CertificateException e) {  
        e.printStackTrace();  
    }  
  
    if (cf == null)  
        return null;  
  
    X509Certificate c = null;  
    try {  
        c = (X509Certificate) cf.generateCertificate(input);  
    } catch (CertificateException e) {  
        e.printStackTrace();  
    }  
  
    if (c==null)  
        return null;  
  
    String hexString = null;  
    try {  
        MessageDigest md = MessageDigest.getInstance(algorithm);  
        byte[] publicKey = md.digest(c.getEncoded());  
        hexString = byte2HexFormatted(publicKey);  
    } catch (NoSuchAlgorithmException e1) {  
        e1.printStackTrace();  
    } catch (CertificateEncodingException e) {  
        e.printStackTrace();  
    }  
    return hexString;  
}  
  
public static String byte2HexFormatted(byte[] arr) {  
    StringBuilder str = new StringBuilder(arr.length * 2);  
    for (int i = 0; i < arr.length; i++) {  
        String h = Integer.toHexString(arr[i]);  
        int l = h.length();  
        if (l == 1) h = "0" + h;  
        if (l > 2) h = h.substring(l - 2, l);  
        str.append(h.toUpperCase());  
        if (i < (arr.length - 1)) str.append(':');  
    }  
    return str.toString();  
}  

你是誰 發表在 痞客邦 留言(0) 人氣()

interface onScreenShotFinishedListener
{
  void onScreenShotFinished(@Nullable Bitmap pBitmap);
}

你是誰 發表在 痞客邦 留言(0) 人氣()

TextView.setTransformationMethod(new PersonalCapitalTransformationMethod(5, 12, '*'));
class PersonalCapitalTransformationMethod extends PasswordTransformationMethod
{
  private int m_Begin;
  private int m_End;
  private char m_Replacement;
  public PersonalCapitalTransformationMethod(int pBegin, int pEnd, char pReplacement)
  {
    super();
    m_Begin = pBegin;
    m_End = pEnd;
    m_Replacement = pReplacement;
  }

你是誰 發表在 痞客邦 留言(0) 人氣()

public class ReconnectInterval
{
  private AtomicInteger m_AtomicCount = new AtomicInteger(0);
  private int m_Max = 12;
  private double A = Math.sqrt(5) / 5;
  private double B = (1 + Math.sqrt(5)) / 2;
  private double C = (1 - Math.sqrt(5)) / 2;

你是誰 發表在 痞客邦 留言(0) 人氣()

double dbAngle = Math.abs(
  180 * Math.atan2((e1.getY() - e2.getY()), (e2.getX() - e1.getX())) / Math.PI);
if (dbAngle > 45 && dbAngle < 135){
  //TODO SOME THINGS
}
else
{
  //TODO SOME THINGS
}

你是誰 發表在 痞客邦 留言(0) 人氣()

StringBuilder tStringBuilder = new StringBuilder();
StackTraceElement[] tStackTraceElement = new Throwable().getStackTrace();
int nStacksLen = tStackTraceElement.length;
if (nStacksLen > 0)
{
  tStringBuilder.append("class: ").append(tStackTraceElement[1].getClassName())
    .append("; method: ").append(tStackTraceElement[1].getMethodName())
    .append("; number: ").append(tStackTraceElement[1].getLineNumber());
}

你是誰 發表在 痞客邦 留言(0) 人氣()

//執行緒池
Dispatcher dispatcher = new Dispatcher(
  new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
  new SynchronousQueue<Runnable>(), 
  Util.threadFactory("OkHttp Dispatcher", false)));

你是誰 發表在 痞客邦 留言(0) 人氣()

layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"

你是誰 發表在 痞客邦 留言(0) 人氣()

RecyclerView 提供相當多種控制Scroll的方法
1.scrollBy(int x, int y)
2.scrollTo(int x, int y)
3.scrollToPosition(int position)
4.smoothScrollBy(int dx, int dy)
5.smoothScrollBy(int dx, int dy, Interpolator interpolator)
6.smoothScrollToPosition(int position)
其中ScrollToPosition與smoothScrollToPosition,
都只能讓指定的Position顯示在畫面上而具體位置在哪則無法控制。

你是誰 發表在 痞客邦 留言(0) 人氣()

AppBarLayout無法滑動時可透過設定DragCallback解決此問題
CoordinatorLayout.LayoutParams tParams = (CoordinatorLayout.LayoutParams) m_AppBarLayout.getLayoutParams();
AppBarLayout.Behavior tBehavior = new AppBarLayout.Behavior();
tBehavior.setDragCallback(new AppBarLayout.Behavior.DragCallback()
{
  @Override
  public boolean canDrag(@NonNull AppBarLayout appBarLayout)
  {
    return true;
  }
});
tParams.setBehavior(tBehavior);

你是誰 發表在 痞客邦 留言(0) 人氣()

當你的線性漸層所需要的顏色不只3種時:
用ShapeDrawable或PaintDrawable
PaintDrawable繼承ShapeDrawable擴展了以下兩個方法來支援圓角

你是誰 發表在 痞客邦 留言(0) 人氣()

GradientDrawable(Orientation orientation, @ColorInt int[] colors)
四個角四個面
Orientation.TOP_BOTTOM
Orientation.TR_BL
Orientation.RIGHT_LEFT
Orientation.BR_TL
Orientation.BOTTOM_TOP
Orientation.BL_TR
Orientation.LEFT_RIGHT
Orientation.TL_BR

你是誰 發表在 痞客邦 留言(0) 人氣()

1
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。