2018年6月25日 星期一

ZXing 條碼掃描器


安裝ZX條碼器

 public void Menu_QRCODE_Click(View v) {
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        if (getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() == 0) {
            // 未安裝
            Toast.makeText(this, "請至 Play 商店安裝 ZXing 條碼掃描器", Toast.LENGTH_LONG).show();
            intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("http://play.google.com/store/apps/details?id=com.google.zxing.client.android"));
            startActivity(intent);
        } else {
            //已安裝
            // SCAN_MODE, 可判別所有支援的條碼
            // QR_CODE_MODE, 只判別 QRCode
            // PRODUCT_MODE, UPC and EAN 碼
            // ONE_D_MODE, 1 維條碼
            intent.putExtra("SCAN_MODE", "SCAN_MODE");
            // 呼叫ZXing Scanner,完成動作後回傳 1 給 onActivityResult 的 requestCode 參數
            startActivityForResult(intent, 1);
        }
    }


// 接收 ZXing 掃描 QRCODE 後回傳來的結果
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                Log.d("MenuActivity","ZXing 掃描 QRCODE 後回傳來的結果 進入OK");
                // ZXing回傳的內容
                final String contents = intent.getStringExtra("SCAN_RESULT");
                e_QRCODE.setText(contents);
            } else if (resultCode == RESULT_CANCELED) {
                Toast.makeText(this, "取消掃描", Toast.LENGTH_LONG).show();
            }
        }
    }

2018年6月24日 星期日

SharedPreferences 簡易存取資料

 SharedPreferences 簡易存取資料

public void writeValue(){//寫入
        SharedPreferences setting=getSharedPreferences(fileName,MODE_PRIVATE);
        setting.edit()
                .putBoolean("check",cheFix.isChecked())   //Checkbox
                .putString("volum",etVolume.getText().toString())   //TextView
                .commit();
    }


    public void readValue(){  //讀
        SharedPreferences getting=getSharedPreferences(fileName,MODE_PRIVATE);
        cheFix.setChecked(getting.getBoolean("check",false));     //若沒有值預設為 false;
        if(cheFix.isChecked()){
            Log.d("Debug","  isChecked ");
            etVolume.setText(getting.getString("volum",etVolume.getText().toString()));
        }else{
            Log.d("Debug"," !   isChecked  ");
        }
    }

//利用Activity的生命週期來存取資料
    @Override
    protected void onStart() {
        super.onStart();
        readValue();
    }
    @Override
    protected void onStop() {
        super.onStop();
        writeValue();
    }


取得網頁上的字串,UTF8亂碼轉BIG5

       
//取得網頁上的字串
HttpURLConnection conn=null;
        try {
            URL httpUri = new URL(url);
            conn = (HttpURLConnection) httpUri.openConnection();
            conn.setReadTimeout(1500); //设置从主机读取数据超时(单位:毫秒)
            conn.setConnectTimeout(1500); //设置连接主机超时(单位:毫秒)
            conn.setRequestProperty("Content-Type","UTF-8");
            conn.setRequestProperty("Accept", "application/json");
            final StringBuffer sb = new StringBuffer();
    //若網頁是BIG5,android預設UTF-8 讀下來會出現亂碼,這邊要設置為BIG5解決亂碼
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"BIG5"));
            String str;
            while((str = reader.readLine()) != null)
            { sb.append(str); }
            Log.d("Deubg",sb.toString());
            allString =sb.toString();
            reader.close();//關閉IO和連結
            conn.disconnect();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(conn!=null)
                conn.disconnect();
        }

EditText隱藏關閉軟鍵盤,觸發軟鍵盤Enter



// 強制隱藏Android輸入法窗口             
 InputMethodManager imm= (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(etCode.getWindowToken(),0);


    //--在空白處關閉軟鍵盤
    public static Boolean hideInputMethod(Context context, View v) {
        InputMethodManager imm = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            return imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }
        return false;
    }
    public static boolean isShouldHideInput(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] leftTop = { 0, 0 };
            v.getLocationInWindow(leftTop);
            int left = leftTop[0], top = leftTop[1], bottom = top + v.getHeight(), right = left
                    + v.getWidth();
            if (event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom) {
                // 保留点击EditText的事件
                return false;
            } else {
                return true;
            }
        }
        return false;
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (isShouldHideInput(v, ev)) {
                if(hideInputMethod(this, v)) {
                    return true; //隐藏键盘时,其他控件不响应点击事件==》注释则不拦截点击事件
                }
            }
        }
        return super.dispatchTouchEvent(ev);
    }

   //軟鍵盤 enter 觸發動作
        etCode.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
  }
});



2018年6月23日 星期六

SmsManager &發送簡訊

int MY_PERMISSION_REQUEST_SEND_SMS = 1;
String SEENT="SMS_SENT";
String DELIVERED="SMS_DELIVERED";
PendingIntent sentPI,deliveredPI;
BroadcastReceiver smsSentReceiver,smsDeliveredReceiver;
final int REQUEST_READ_PHONE_STATE = 1 ;


protected void onCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                   setContentView(R.layout.activity_main);      
                   sentPI= PendingIntent.getBroadcast(this,0,new Intent(SEENT),0);
                   deliveredPI= PendingIntent.getBroadcast(this,0,new Intent(DELIVERED),0);
}

    @Override
    protected void onResume() { 
  smsSentReceiver =new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode()){
                    case Activity.RESULT_OK:
                        Log.d("Debug","  SMS sent");
                        Toast.makeText(MainActivity.this, "短信发送成功", Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Log.d("Debug","  SMS   FAILURE");
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Log.d("Debug","  NO  _ SERVICE ");
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Log.d("Debug"," NULL  _  PDU");
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Log.d("Debug","  RADIO  _  OFF");
                        break;
                }

            }
        }; 
  smsDeliveredReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                switch (getResultCode()){
                    case Activity.RESULT_OK:
                        //(供应商已经发送成功,但是对方没有收到)。
                        Toast.makeText(MainActivity.this, "短信是否被对方收到的状态信息", Toast.LENGTH_SHORT).show();

                        Log.d("Debug","  SMS  Delivere");
                        break;
                    case Activity.RESULT_CANCELED:
                        Log.d("Debug","  SMS  not   Delivere");
                        break;
                }

            }
        };

        registerReceiver(smsSentReceiver,new IntentFilter(SEENT));
        registerReceiver(smsDeliveredReceiver,new IntentFilter(DELIVERED)); 

}

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(smsDeliveredReceiver);
        unregisterReceiver(smsSentReceiver);
    }



  public void onSend_(View view){

if(ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED)
        {
           
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.SEND_SMS} , MY_PERMISSION_REQUEST_SEND_SMS);
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSION_REQUEST_SEND_SMS);

        }else{
            final SmsManager sms=SmsManager.getDefault();
            //第一個參數電話號碼,第三個參數簡訊內容 
            sms.sendTextMessage(number",null,message,sentPI,deliveredPI);
        }
}




android.permission.READ_PHONE_STATE权限出现SecurityException异常

發送簡訊使用android.permission.READ_PHONE_STATE权限出现SecurityException异常


READ_PHONE_STATE的权限问题,尽管在manifest中添加了该权限,仍然会报权限不足

READ_PHONE_STATE这个权限在Android6.0(Api 23)及以上的版本,不仅需要在manifest中添加权限,还需要在运行时请求权限。


动态请求权限:
int permissionCheck = ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE},REQUEST_READ_PHONE_STATE);
    }
//----------------------------------------------------------------------------------
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case REQUEST_READ_PHONE_STATE:
            if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                //TODO
            }
            break;
        default:
            break;
    }
}


版权声明:本文为博主原创文章,转载注明出处。 https://blog.csdn.net/wuhaibin12/article/details/79946777