HTML/JavaScript小工具

HTML/JavaScript小工具

2017年2月16日 星期四

android 手電筒寫法


AndroidManifest 加入
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />




Camera camera;
Camera.Parameters parameters;
@Overrideprotected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton);

    toggleButton.setTextOff("關燈");
    toggleButton.setTextOn("開燈");

    toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            String msg = "關燈";
            if (isChecked){
                msg = "開燈";
                open();
          }else{
                close();
            }

            Toast.makeText(MainActivity.this,"開燈",Toast.LENGTH_SHORT).show();

        }
    });
}


public void open() {
    camera = Camera.open();

    SurfaceTexture mDummy = new SurfaceTexture(1); // any int argument will do    try {
        camera.setPreviewTexture(mDummy);
    } catch (IOException e) {
        e.printStackTrace();
    }
    parameters = camera.getParameters();
    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
    camera.setParameters(parameters);
    camera.startPreview();
}


public void close() {
    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    camera.setParameters(parameters);
    camera.release();
}

Looper


  1. MessageQueue存放Message的物件
    1.  
  2. Thread+Looper 取得處理消息的執行緒 
    1. 一個Thread只有一個Looper  
    2. Looper  內幾個重要方法
      • myLooper 取得我執行緒目前的Looper
      • getMainLooper 取得UI執行緒的Looper
      • quit 結束收集
      • loop 開始不停的收集資訊給Handler 
      • prepare 自己建立的執行緒 使用Looper前要使用此方法準備一個Looper
  3.  Message
    1. 消息的格式 Message 會記錄 用在哪個Handler,同一個Message 物件不可用在不同的Handler
  4.  Handler
    1. 發送的函數 Handler post sendMessage

MainActivity

public class MainActivity extends AppCompatActivity {
    MyHandlerThread mHandlerThread = null;    
@Override    
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
setContentView(R.layout.activity_main);        
Handler myHander = new Handler();        
Log.d("MainActivity.myLooper()", Looper.myLooper().toString());        
Log.d("MainActivity.MainLooper", Looper.getMainLooper().toString());      
  Log.d("myHander", myHander.getLooper()+"");
    }


    public void start(View view){
       TextView textView = (TextView) findViewById(R.id.textView);       
 mHandlerThread = new MyHandlerThread();   
     mHandlerThread.textView = textView;      
  mHandlerThread.start();    }

    public void sendMsg(View view){
        Message msg = new Message();        
msg.obj = "Test:"+(Math.random()*1000)%1000;    
    mHandlerThread.mHandler.sendMessage(msg);    }
}


MyHandlerThread
public class MyHandlerThread extends Thread {

    public static final String TAG = "MyHT";    
public TextView textView;   
 public Handler mHandler;   
 public Handler myHanderUI;   
 public void run(){
        myHanderUI = new Handler(Looper.getMainLooper()){
             @Override             
public void handleMessage(Message msg) {
                 textView.setText("Msg:"+msg.obj);               
  super.handleMessage(msg);             }
        };
        Log.d("Howard","MyHandlerThread  myHander:"+
myHanderUI.getLooper());        if (Looper.myLooper() == null){
            Looper.prepare();        }
        mHandler = new Handler(Looper.myLooper()){

            @Override           
 public void handleMessage(Message msg) {
                Message myMsg = new Message();              
  myMsg.obj = msg.obj;                
myHanderUI.sendMessage(myMsg);               
 Log.d("Howard","handleMessage:"+msg.obj);             
   super.handleMessage(msg);            }
        };        Looper.loop();    }

}


2017年2月14日 星期二

寫一篇android 6.0權限的文章

第一件事注意你使用的Android SDK必須是6.0或以上的歐

在6.0之前我們呼叫CALL_PHONE是很超簡單的事
1 先去AndroidManifest 設定Permissions
2 在Activity內呼叫Intent 呼叫一下搞定!!

到了6.0尷尬了~~他將權限分為危險與普通,危險的如以下
常用的我把他標起來
Permission GroupPermissions
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE
這一來就需要額外的動作了,這邊我用CALL_PHONE為例簡單說一下首先
1 還是需要去AndroidManifest 設定Permissions
2 在你需使用CALL_PHONE之前呼叫
int permission =  checkSelfPermission(CALL_PHONE);
以上主要是檢查是否已通過此CALL_PHONE權限
3 checkSelfPermission 回傳值是一個整數,可用以下常數判定是否通過此權限
//已擁有權限-PackageManager.PERMISSION_GRANTED
//無權限-PackageManager.PERMISSION_DENIED

4如果沒有通過權限就呼叫requestPermissions 跳出視窗請使用者選是否要開啟權限,這邊注意一下requestPermissions方法 ,中的字串陣列是來自於
android.Manifest.permission.*;
參數中的100是定義一個requestCode 可隨意定,之後會用到

程式範例如下:

@SuppressWarnings("MissingPermission")
private void call(){
    Intent in = new Intent(Intent.ACTION_CALL);    
in.setData(Uri.parse("tel:123"));  
 startActivity(in);}


public void click(View view){
    if (checkVesrion()) {
        int permission = checkSelfPermission(CALL_PHONE);     
   if (permission == PackageManager.PERMISSION_DENIED) {
            requestPermissions(new String[]{CALL_PHONE},               
              100);        } else {
            call();//呼叫打電話      
             }
    }
}

4 執行後會彈出如圖所示的選單讓我們確定是否要開啟權限

















5 那如何知道使用者選的是拒絕 還是允許呢?
必須複寫Activity的

public void onRequestPermissionsResult(int requestCode,                                    
   String[] permissions,                                       
 int[] grantResults) 

注意當中的requestCode就是requestPermissions中設定的100
可使用grantResults陣列判定是否取得權限如下所程式碼
//已擁有權限-PackageManager.PERMISSION_GRANTED
//無權限-PackageManager.PERMISSION_DENIED

@Override
public void onRequestPermissionsResult(int requestCode,                                     
 String[] permissions,         int[] grantResults) {
    if (requestCode == 100  && grantResults[0]
            ==PackageManager.PERMISSION_GRANTED ){

        call();//呼叫打電話    }
}

2017年2月7日 星期二

發生 Resolved versions for app (23.4.0) and test app (23.1.1) differ錯誤解法如下


加入以下
如gradle
androidTestCompile 'com.android.support:support-annotations:23.1.0'


configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:23.1.0'
}