您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
處理拉流結束回調及動態相機權限獲取及拉流推流整合完成(魅族16T與pixel4a)
发布时间:2022-04-30 17:10:48编辑:雪饮阅读()
權限整合
上次有處理自動化獲取sdcard寫入權限,但實際上我們拉流與推流還有用到相機權限的。
那麽做了sdcard寫入權限后,相機權限也就很簡單了。
<uses-permission android:name="android.permission.CAMERA" />
放置于AndroidManifest.xml中位於manifest根節點。
和之前的sdcard權限進行整合,則請求碼就需要兩個了
final int requestCode_WRITE_EXTERNAL_STORAGE=22;
final int requestCode_CAMERA=23;
然後單獨封裝一個公共的獲取權限的方法
protected void getPermission(){
//從沒有授權過文件寫入權限
if ((ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) && (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)==false)) {
////从没有请求过权限、拒绝后不再询问
//讓用戶授權文件寫入權限
Log.i("权限","请求权限");
ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },requestCode_WRITE_EXTERNAL_STORAGE);
}
//上次用戶拒絕了文件寫入權限
else if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Log.i("权限","需要给用户说明为什么请求这个权限");
}
//相機權限
else if ((ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) && (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)==false)) {
ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.CAMERA },requestCode_CAMERA);
}
else if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)){
}
else{
}
}
那麽這個獲取權限的方法在進入MainActivity時候就要首先執行一次,然後考慮多個權限的情況,所以權限請求碼回調処也要執行
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.getPermission();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
switch (requestCode) {
case requestCode_WRITE_EXTERNAL_STORAGE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 &&grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "sdcard存儲權限授权成功", Toast.LENGTH_SHORT).show();
this.getPermission();
} else {
Toast.makeText(this, "授權sdcard存儲權限失败", Toast.LENGTH_SHORT).show();
Timer timer;
timer = new Timer();//时间监听器
AppCompatActivity th=this;
timer.schedule(new TimerTask() {
@Override
public void run() {
th.finish();
System.exit(0);
}
},4000);
}
return;
case requestCode_CAMERA:
if (grantResults.length > 0 &&grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "相機權限授权成功", Toast.LENGTH_SHORT).show();
this.getPermission();
} else {
Toast.makeText(this, "相機權限失败", Toast.LENGTH_SHORT).show();
Timer timer;
timer = new Timer();//时间监听器
AppCompatActivity th=this;
timer.schedule(new TimerTask() {
@Override
public void run() {
th.finish();
System.exit(0);
}
},4000);
}
return;
}
}
至此sdcard權限和相機權限都能動態獲取了。
修復拉流錯誤回調問題
之前寫的很着急,拉流錯誤回調的時候其實並沒有把錯誤碼回調過去,但是程序沒有報錯,可能是因爲有int默認值問題吧,這裏沒有具體深究,直接解決該問題就是在子綫程回調裏面把我們的錯誤碼也附加回調過去
//可能是主线程 异步线程
void JNICallback::onErrorAction(int thread_mode, int error_code) {
if (thread_mode == THREAD_MAIN) {
//主线程,可以使用env
this->jniEnv->CallVoidMethod(this->instance, this->jmd_error);
} else if (thread_mode == THREAD_CHILD) {
//子线程, 不能使用env,开启 附加线程,javaVm附加
JNIEnv *env = nullptr;
int ret = this->javaVm->AttachCurrentThread(&env, 0);
if (ret != JNI_OK) {
return;
}
env->CallVoidMethod(this->instance, jmd_error,error_code);
//解除附加
this->javaVm->DetachCurrentThread();
}
}
今天早些時候還老以爲是c++中宏定義的-1到了java這邊傳參出現了某些類型轉換之類的導致溢出呢。。。
不過最後這也的確是傳參問題。。。
拉流推流整合測試
現在拉流也差不多算是好了,我手裏另外一臺魅族16T今天就起到作用了,可以和我這個pixel4a結合測試推流與拉流了。
雖然魅族16T是安卓9,但之前寫的時候兼容的最小安卓版本是api28,這也正好,cpu目前僅適配armeabi-v7a,這個好像兼容性更好,如果是armv8a好像老的機型就不兼容了。
我的pixel4a是安卓12的。
分別運行到兩個手機上,魅族16T這邊我還又買了一條數據綫。。。安卓9要root后才能開啓無綫調試,魅族16T我好像是一直沒有root成功,具體情況不太清楚了,反正乾脆直接買一條省心。
運行到兩個手機上之後,只需要相互交換推流與拉流地址即可實現推流與拉流了。
关键字词:拉流,推流,整合,rtmp,魅族16t,pixel4a