2019年2月7日 星期四

Android系統權限

Android系統權限

添加於manifest
<uses-permission android:name="android.permission.權限名稱" />

Android權限名稱

CALENDAR
  • READ_CALENDAR
  • WRITE_CALENDAR
CAMERA
  • CAMERA
CONTACTS
  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS
LOCATION
  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION
MICROPHONE
  • RECORD_AUDIO
PHONE
  • READ_PHONE_STATE
  • CALL_PHONE
  • READ_CALL_LOG
  • WRITE_CALL_LOG
  • ADD_VOICEMAIL
  • USE_SIP
  • PROCESS_OUTGOING_CALLS
SENSORS
  • BODY_SENSORS
SMS
  • SEND_SMS
  • RECEIVE_SMS
  • READ_SMS
  • RECEIVE_WAP_PUSH
  • RECEIVE_MMS
STORAGE
  • READ_EXTERNAL_STORAGE
  • WRITE_EXTERNAL_STORAGE

Android執行時請求權限

public class MainActivity extends AppCompatActivity {

    final int MY_PERMISSIONS_REQUEST_READ_CONTACTS = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initial();
    }

    private void initial() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {

                    //權限請求           
                    ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
        }
    }

//權限請求回應    
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //權限被接受
                } else {
                //權限被拒絕
                }
                return;
            }

        }
    }

}

以上以聯絡人權限為例,權限請求回應可依照個人需求不寫
manifest記得加
<uses-permission android:name="android.permission.READ_CONTACTS">

2019年2月5日 星期二

python第三方庫 Unofficial Windows Binaries for Python Extension Packages

加州大學提供完整的Python Packages,所有庫缺失,可以先來這裡看看

網址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/


如何安裝.whl文件
















下載版本對應的.whl檔後,開啟cmd輸入
pip install 包位址/包名字.whl 即可安裝

使用pyAudio錄音及播放

pyAudio是開源聲音庫PortAudio(http://www.portaudio.com/)提供的Python庫

使用pyAudio播放聲音
import pyaudio
import wave

buf = 1024

wf = wave.open(r"C:\Users\yuli\Desktop\a\forest.wav", 'rb')

p = pyaudio.PyAudio()

stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output = True)

while True:
    data = wf.readframes(buf)
    if data == "": break
    stream.write(data)

stream.close()
p.terminate()
pyAudio類的open函數參數:
  • rate - 取樣頻率
  • channel - 聲道
      • 1=>mono為單聲道
      • 2=>stereo為雙聲道(立體聲)
      • format - 取樣值量化格式
        • pyaudio.paFloat32 = 1
        • pyaudio.paInt32 = 2
        • pyaudio.paInt24 = 4
        • pyaudio.paInt16 = 8
        • pyaudio.paInt8 = 16
        • pyaudio.paUInt8 = 32
        • pyaudio.paCustomFormat = 65536
      • input - 若為True則為開啟輸入流
      • output - 若為True則為開啟輸出流
      • input_device_index - 輸入所使用的設備編號,不指定則為系統預設
      • output_device_index - 輸出所使用的設備編號,不指定則為系統預設
      • frames_per_buffer - 緩存塊大小
      • start - 是否立即開始輸入輸出流,不指定則為True

      使用pyAudio錄音
      from pyaudio import PyAudio, paInt16 
      import numpy as np 
      from datetime import datetime 
      import wave 
      
      def save_wave_file(filename, data): 
          wf = wave.open(filename, 'wb') 
          wf.setnchannels(1) 
          wf.setsampwidth(2) 
          wf.setframerate(SAMPLING_RATE) 
          wf.writeframes(b"".join(data)) 
          wf.close() 
      
      NUM_SAMPLES = 2000      
      SAMPLING_RATE = 8000    
      LEVEL = 1500            
      COUNT_NUM = 20          
      SAVE_LENGTH = 8         
      
      pa = PyAudio() 
      stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True, 
                      frames_per_buffer=NUM_SAMPLES) 
      
      save_count = 0 
      save_buffer = [] 
      
      while True: 
          string_audio_data = stream.read(NUM_SAMPLES) 
          audio_data = np.fromstring(string_audio_data, dtype=np.short) 
          large_sample_count = np.sum( audio_data > LEVEL ) 
          print(np.max(audio_data))
          if large_sample_count > COUNT_NUM: 
              save_count = SAVE_LENGTH 
          else: 
              save_count -= 1 
      
          if save_count < 0: 
              save_count = 0 
      
          if save_count > 0: 
              save_buffer.append( string_audio_data ) 
          else: 
              if len(save_buffer) > 0: 
                  filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav" 
                  save_wave_file(filename, save_buffer) 
                  save_buffer = [] 
                  print(filename, "saved")