安卓直播推流

本文介绍了在安卓平台上进行直播推流的实现过程,包括引入SRS客户端库net.ossrs.yasea,并详细讲解了如何在Activity中配置和使用推流功能。

1.引用net.ossrs.yasea包

2.activity

public class PreviewActivity extends Activity implements RtmpHandler.RtmpListener,
        SrsRecordHandler.SrsRecordListener, SrsEncodeHandler.SrsEncodeListener {
    @BindView(R.id.iv_guanbi1)
    ImageView ivGuanbi;
    @BindView(R.id.iv_zhaopian)
    ImageView ivZhaopian;
    @BindView(R.id.tv_zhibobiaoti)
    EditText tvZhibobiaoti;
    @BindView(R.id.act_login_btn_login)
    Button actLoginBtnLogin;
    @BindView(R.id.tv_daojishi)
    TextView tvDaojishi;
    @BindView(R.id.rl_zhuanbei)
    RelativeLayout rlzhunbei;
    @BindView(R.id.kaishi_zhibo)
    RelativeLayout kaishizhibo;
    @BindView(R.id.civ_touxiang)
    CircleImageView civTouxiang;
    @BindView(R.id.tv_name)
    TextView tvName;
    @BindView(R.id.tv_guankan_renshu)
    TextView tvGuankanRenshu;
    @BindView(R.id.tv_guanzhu)
    TextView tvGuanzhu;

    @BindView(R.id.tv_zaixin_renshu)
    TextView tvZaixinRenshu;

    @BindView(R.id.zhibo_hlist_touxiang)
    HorizontalListView hlistTouxiang;
    @BindView(R.id.glsurfaceview_camera_1)
    SrsCameraView mCameraView;
    @BindView(R.id.pause)
    Button pause;
    @BindView(R.id.publish)
    Button publish;
    @BindView(R.id.record)
    Button record;
    @BindView(R.id.swEnc)
    Button swEnc;
    @BindView(R.id.url)
    EditText url;
    @BindView(R.id.swCam)
    ImageView swCam;
    @BindView(R.id.iv_guanbi_zhibo)
    ImageView ivGuanbiZhibo;
    @BindView(R.id.svgaImage)
    SVGAImageView svgaImage;

    private int time = 10;
    private Timer timer;
    private Timer timer1;
    private int time1=3;
    Unbinder unbinder1;
    View view;
    private boolean autoReconnect = true;
    private boolean error;
    private static String OOS_ACCESS_KEY;
    private static String OOS_ACCESS_ID;
    private static String OOS_ENDPOINT;
    private static String BUCKET_NAME;
    public static final int TAKE_PHOTO = 1;
    public static final int CHOOSE_PHOTO = 2;
    public static final int NAME = 3;
    private static final int REQUEST_CODE = 10;
    private String lujing;
    private static final String TAG = "Yasea";
    public final static int RC_CAMERA = 100;

    private SharedPreferences sp;
    private SrsPublisher mPublisher;
    private String rtmpUrl;
    private String recPath = Environment.getExternalStorageDirectory().getPath() + "/test.mp4";
    private int mWidth = 1280;
    private int mHeight = 720;
    private boolean isPermissionGranted = false;
    private String tupian, fangjianhao, fangjianmingchneg;
    private ArrayList<String> keylist = new ArrayList<String>();
    private ArrayList<String> viuelist = new ArrayList<String>();
    private static final int CAMERA_PERMISSION_REQUEST_CODE = 100;
    private PicAdapter adapter1;
    private List<GuanZhuRenshuModel.DataBean.OnLinePeopleListBean> guankanlist = new ArrayList<>();
    private Button btn_baocun;
    private List<String> photoList;
    private String xingbie;
    private Uri imageUri;
    private String mytoken;
    private File finalFile;
    String imageStr = "";
    private String userId;
    private Uri image;
    private String gkrs, gzrs, uuid;
    private String nicheng,type;
    private TextView mTvStart;
    private TextView mTvEnd;
    private TextView mTvTime;
    private int dianji;
    private int recLen = 3;
    private ServiceConnection mServiceConnection;
    private static final int EXTERNAL_STORAGE_REQ_WRITE_EXTERNAL_STORAGE_CODE = 101;
    private int yichang;
    private NetWorkStateReceiver netWorkStateReceiver;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
//                    tvDaojishi.setText(time + "");
                    time--;
                    if (time <= 0) {
                        guankanrenshu();
                        guanzhushu();
                    }
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_preview);
        ButterKnife.bind(this);
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        uuid = sPreferences.getString("userid", "");
        type=sPreferences.getString("type","");
        if (type.equals("0")){
         Intent intent=new Intent(PreviewActivity.this,ShiMing1Activity.class);
         startActivity(intent);
         finish();
        }
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        huoqufangjian2();
//        requestPermission();
        initListView();
        sp = getSharedPreferences("Yasea", MODE_PRIVATE);
        rtmpUrl = sp.getString("rtmpUrl", rtmpUrl);

        // initialize url.
//        final EditText efu = (EditText) findViewById(R.id.url);
//        efu.setText(rtmpUrl);
        // initialize url.
        final EditText efu = (EditText) findViewById(R.id.url);
//      efu.setText(rtmpUrl);
        pause.setEnabled(false);
        mCameraView = (SrsCameraView) findViewById(R.id.glsurfaceview_camera_1);
        mPublisher = new SrsPublisher(mCameraView);
        个人资料();
        NetworkManager.getInstance().registerObserver(this);
        EventBus.getDefault().register(this);
        JPushInterface.setDebugMode(true);//正式版的时候设置false,关闭调试
        JPushInterface.init(PreviewActivity.this);
        SVGAParser.Companion.shareParser().init(this);
        netWorkStateReceiver = new NetWorkStateReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                detectNetWork();
            }
        };
    }

    protected void detectNetWork() {
        if (!isConnected(this)) {
        }
    }

    private void requestPermission() {
        //1. 检查是否已经有该权限
        if (Build.VERSION.SDK_INT >= 23 && (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED)) {
            //2. 权限没有开启,请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}, RC_CAMERA);
        } else {
            //权限已经开启,做相应事情
            isPermissionGranted = true;

        }
    }

    //3. 接收申请成功或者失败回调
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == RC_CAMERA) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //权限被用户同意,做相应的事情
                isPermissionGranted = true;

            } else {
                //权限被用户拒绝,做相应的事情
                finish();
            }
        }
    }

    private void init() {

        mPublisher.setEncodeHandler(new SrsEncodeHandler(this));
        mPublisher.setRtmpHandler(new RtmpHandler(this));
        mPublisher.setRecordHandler(new SrsRecordHandler(this));
        mPublisher.setPreviewResolution(mWidth, mHeight);
        mPublisher.setOutputResolution(mHeight, mWidth); // 这里要和preview反过来
        mPublisher.setVideoHDMode();
        mPublisher.startCamera();
        mCameraView.setCameraCallbacksHandler(new SrsCameraView.CameraCallbacksHandler() {
            @Override
            public void onCameraParameters(Camera.Parameters params) {
                //params.setFocusMode("custom-focus");
                //params.setWhiteBalance("custom-balance");
                //etc...
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
       requestPermission();

    }

    @Override
    protected void onResume() {
        super.onResume();
        final Button btn = (Button) findViewById(R.id.publish);
        btn.setEnabled(true);
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Message msg = Message.obtain();
                msg.what = 1;
                handler.sendMessage(msg);
            }
        }, 0, 10000);
        guankanrenshu();
        guanzhushu();
        mPublisher.resumeRecord();
        registerReceiver(netWorkStateReceiver, new IntentFilter(
                ConnectivityManager.CONNECTIVITY_ACTION));

    }

    @Override
    protected void onPause() {
        super.onPause();
        mPublisher.pauseRecord();
        try {
            unregisterReceiver(netWorkStateReceiver);
        } catch (Exception e) {
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (dianji==1) {
            mPublisher.stopPublish();
            mPublisher.stopRecord();
            EventBus.getDefault().unregister(this);//反注册EventBus
            NetworkManager.getInstance().unRegisterObserver(this);
        }

//        unregisterReceiver(netWorkStateReceiver);
    }

    public boolean isConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        return (info != null && info.isConnected());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mPublisher.stopEncode();
        mPublisher.stopRecord();
        record.setText("record");
        mPublisher.setScreenOrientation(newConfig.orientation);
        if (publish.getText().toString().contentEquals("stop")) {
            mPublisher.startEncode();
        }
        mPublisher.startCamera();
    }

    private static String getRandomAlphaString(int length) {
        String base = "abcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }


    private void handleException(Exception e) {
        error = true;

        try {
//            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
            mPublisher.stopPublish();
            mPublisher.stopRecord();
            publish.setText("publish");
            record.setText("record");
            swEnc.setEnabled(true);
        } catch (Exception e1) {
            //
        }
    }

    // Implementation of SrsRtmpListener.

    @Override
    public void onRtmpConnecting(String msg) {
        Log.i(TAG, msg);
        if (msg.equals(" Broken pipe")) {

        }

    }

    @Override
    public void onRtmpConnected(String msg) {
        Log.i(TAG, msg);
        if (msg.equals(" Broken pipe")) {

        }

    }

    @Override
    public void onRtmpVideoStreaming() {

    }

    @Override
    public void onRtmpAudioStreaming() {

    }

    @Override
    public void onRtmpStopped() {
        Log.i(TAG, "Stopped");

    }

    @Override
    public void onRtmpDisconnected() {
        Log.i(TAG, "Disconnected");

    }

    @Override
    public void onRtmpVideoFpsChanged(double fps) {
        Log.i(TAG, String.format("Output Fps: %f", fps));

    }

    @Override
    public void onRtmpVideoBitrateChanged(double bitrate) {
        int rate = (int) bitrate;
        if (rate / 1000 > 0) {
            Log.i(TAG, String.format("Video bitrate: %f kbps", bitrate / 1000));
        } else {
            Log.i(TAG, String.format("Video bitrate: %d bps", rate));
        }
    }

    @Override
    public void onRtmpAudioBitrateChanged(double bitrate) {
        int rate = (int) bitrate;
        if (rate / 1000 > 0) {
            Log.i(TAG, String.format("Audio bitrate: %f kbps", bitrate / 1000));
        } else {
            Log.i(TAG, String.format("Audio bitrate: %d bps", rate));
        }
    }

    @Override
    public void onRtmpSocketException(SocketException e) {
        handleException(e);
    }

    @Override
    public void onRtmpIOException(IOException e) {
        handleException(e);
    }

    @Override
    public void onRtmpIllegalArgumentException(IllegalArgumentException e) {
        handleException(e);
    }

    @Override
    public void onRtmpIllegalStateException(IllegalStateException e) {
        handleException(e);
    }

    // Implementation of SrsRecordHandler.

    @Override
    public void onRecordPause() {
        Log.i(TAG, "Record paused");
    }

    @Override
    public void onRecordResume() {
        Log.i(TAG, "Record resumed");
    }

    @Override
    public void onRecordStarted(String msg) {
        Log.i(TAG, "Recording file: " + msg);
    }

    @Override
    public void onRecordFinished(String msg) {
        Log.i(TAG, "MP4 file saved: " + msg);
    }

    @Override
    public void onRecordIOException(IOException e) {
        handleException(e);
    }

    @Override
    public void onRecordIllegalArgumentException(IllegalArgumentException e) {
        handleException(e);
    }

    // Implementation of SrsEncodeHandler.

    @Override
    public void onNetworkWeak() {
        Log.i(TAG, "Network weak");
    }

    @Override
    public void onNetworkResume() {
        Log.i(TAG, "Network resume");
    }

    @Override
    public void onEncodeIllegalArgumentException(IllegalArgumentException e) {
        handleException(e);
    }

    public void guanbizhibo() {
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        OkGo.<String>post(HttpUtils.url + "/tel/live/closeRoom").headers("authorization", mytoken).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                GuanbiZhiboModel userModel = new GuanbiZhiboModel();
                userModel = new Gson().fromJson(response.body(), GuanbiZhiboModel.class);

                if (userModel.getCode() == 1) {
                    Intent intent = new Intent(PreviewActivity.this, EndOfLiveBroadcast_2Activity.class);
                    intent.putExtra("jine", userModel.getData().getCoin() + "");
                    intent.putExtra("shijian", userModel.getData().getTime() + "");
                    intent.putExtra("renshu", userModel.getData().getPeopleCount() + "");
                    startActivity(intent);
                    finish();
                } else if (userModel.getCode() == 401) {
                    SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
                    SharedPreferences.Editor edit = sPreferences.edit();
                    edit.putString("userid", "");
                    edit.putString("token", "");
                    edit.putString("name", "");
                    edit.commit();
                    finish();
                    ToastUtils.showToast("请重新登录");
                    startActivity(new Intent(PreviewActivity.this, LoginActivity.class));
                } else {
                    ToastUtils.showToast(userModel.getMsg());
                }
            }
        });
    }

    private void initListView() {
        photoList = new ArrayList<>();
        photoList.add("拍照");
        photoList.add("从相册中选择");
    }

    private void gengxin() {
        /**
         * 验证码
         */
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        HashMap<String, String> hash = new HashMap<>();
        hash.put("roomName", tvZhibobiaoti.getText().toString());
//        finalFile.getAbsolutePath()
        hash.put("roomPicUrl", lujing);
        String str = new String();
        str = new Gson().toJson(hash);
        OkGo.<String>post(HttpUtils.url + "/tel/live/putRoomMsg").upJson(str).headers("authorization", mytoken).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                User bank = new User();
                bank = new Gson().fromJson(response.body(), User.class);
                if (bank.getCode() == 1) {
                    TuiJianModel shouYeXiaoXiModel = new TuiJianModel();
                    shouYeXiaoXiModel = new Gson().fromJson(response.body().toString(), TuiJianModel.class);
                    if (shouYeXiaoXiModel.getCode() == 1) {
                       start_zhibo();
                    }

                } else if (bank.getCode() == 401) {
                    SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
                    SharedPreferences.Editor edit = sPreferences.edit();
                    edit.putString("userid", "");
                    edit.putString("token", "");
                    edit.putString("name", "");
                    edit.commit();
                    finish();
                    ToastUtils.showToast("请重新登录");
                    startActivity(new Intent(PreviewActivity.this, LoginActivity.class));
                } else {
                    Toast.makeText(PreviewActivity.this, bank.getMsg(), Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void jieshu() {
        mPublisher.stopPublish();
        mPublisher.stopRecord();
    }

    private void kaishi() {
        mPublisher.startPublish(rtmpUrl);
        mPublisher.startCamera();

        if (swEnc.getText().toString().contentEquals("soft encoder")) {
        } else {
        }
        publish.setText("暂停");
        swEnc.setEnabled(false);
        publish.setEnabled(true);

    }

    @OnClick({R.id.iv_guanbi1, R.id.act_login_btn_login, R.id.iv_zhaopian, R.id.pause, R.id.publish, R.id.record, R.id.swEnc, R.id.iv_guanbi_zhibo, R.id.swCam})
    public void onViewClicked(View view) {
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("rtmpUrl", rtmpUrl);
        editor.apply();
        switch (view.getId()) {
            case R.id.iv_guanbi1:
                finish();
                break;
            case R.id.iv_zhaopian:
                View photoView = View.inflate(PreviewActivity.this, R.layout.item_listview_dialog, null);//填充ListView布局
                ListView listView = (ListView) photoView.findViewById(R.id.lv_item_listview_dialog);//初始化ListView控件
                listView.setAdapter(new DialogListViewAdapter(PreviewActivity.this, photoList));//ListView设置适配器

                final AlertDialog dialog = new AlertDialog.Builder(PreviewActivity.this)
                        .setView(photoView)//在这里把写好的这个listview的布局加载dialog中
                        .create();
                dialog.show();
                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {//响应listview中的item的点击事件

                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                            long arg3) {
                        // TODO Auto-generated method stub
                        TextView tv = (TextView) arg1.findViewById(R.id.tv_item_listview_dialog_text);//取得每条item中的textview控件
                        String aiche = tv.getText().toString();
                        if ("拍照".equals(aiche)) {

                            File outputImage = new File(getExternalCacheDir(),
                                    System.currentTimeMillis() + "output_image.jpg");
                            try {
                                if (outputImage.exists()) {
                                    outputImage.delete();
                                }
                                outputImage.createNewFile();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            if (Build.VERSION.SDK_INT >= 23) {
                                imageUri = FileProvider.getUriForFile(PreviewActivity.this,
                                        "com.qlyy.cloudanimal.fileprovider", outputImage);
                            } else {
                                //调用相机

                                imageUri = Uri.fromFile(outputImage);
                            }
                            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                            startActivityForResult(intent, TAKE_PHOTO);

                        } else if ("从相册中选择".equals(aiche)) {

                            Intent intent = new Intent("android.intent.action.GET_CONTENT");
                            intent.setType("image/*");
                            startActivityForResult(intent, CHOOSE_PHOTO);
                        }
                        dialog.dismiss();
                    }
                });
                break;
            case R.id.act_login_btn_login:
                if (tvZhibobiaoti.getText().toString().equals("请输入直播标题") || tvZhibobiaoti.getText().toString() == "" || tvZhibobiaoti.getText().toString() == null || tvZhibobiaoti.getText().toString().length() < 1) {
                    Toast.makeText(PreviewActivity.this, "请输入直播标题", Toast.LENGTH_SHORT).show();
                    return;
                }
                dianji = 1;
                if (!Check.isFastClick()) {
                    Toast.makeText(PreviewActivity.this,"请勿频繁点击",Toast.LENGTH_SHORT).show();
                    return;
                }
                gengxin();

                break;
            case R.id.pause:
                if (pause.getText().toString().equals("Pause")) {
                    mPublisher.pausePublish();
                    pause.setText("resume");
                } else {
                    mPublisher.resumePublish();
                    pause.setText("Pause");
                }
                break;
            case R.id.publish:
                if (publish.getText().toString().equals("开始")) {
                    kaishi();
                    publish.setText("暂停");
                } else if (publish.getText().toString().equals("暂停")) {
                    jieshu();
                    publish.setText("开始");
                }
                break;
            case R.id.record:
                if (record.getText().toString().contentEquals("record")) {
                    if (mPublisher.startRecord(recPath)) {
                        record.setText("pause");
                    }
                } else if (record.getText().toString().contentEquals("pause")) {
                    mPublisher.pauseRecord();
                    record.setText("resume");
                } else if (record.getText().toString().contentEquals("resume")) {
                    mPublisher.resumeRecord();
                    record.setText("pause");
                }
                break;
            case R.id.swEnc:
                if (swEnc.getText().toString().contentEquals("soft encoder")) {
                    mPublisher.switchToSoftEncoder();
                    swEnc.setText("hard encoder");
                } else if (swEnc.getText().toString().contentEquals("hard encoder")) {
                    mPublisher.switchToHardEncoder();
                    swEnc.setText("soft encoder");
                }
                break;
            case R.id.iv_guanbi_zhibo:
                AlertDialog alertDialog = new AlertDialog.Builder(PreviewActivity.this)
                        .setTitle("提示")
                        .setMessage("小朋友正在赶来的路上 确认要退出吗?")
                        .setPositiveButton("继续退出", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO: 2018/4/16 positive
                                if (dianji == 1) {
                                    mPublisher.stopPublish();
                                    mPublisher.stopRecord();
                                    guanbizhibo();
                                } else {
                                    finish();
                                }

                            }
                        })
                        .setNegativeButton("再等等", new DialogInterface
                                .OnClickListener
                                () {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO: 2018/4/16 negative
                            }
                        })
                        .create();
                alertDialog.show();
                alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.GRAY);
                alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(Color.RED);
                break;
            case R.id.swCam:
                mPublisher.switchCameraFace((mPublisher.getCameraId() + 1) % Camera.getNumberOfCameras());
                break;
        }
    }

    private void guanzhushu() {
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        uuid = sPreferences.getString("userid", "");
        OkGo.<String>get(HttpUtils.url + "/tel/userInfo/anchorCount" + "?anchorId=" + uuid).headers("authorization", mytoken).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                ZhuboGuanzhu bank = new ZhuboGuanzhu();
                bank = new Gson().fromJson(response.body(), ZhuboGuanzhu.class);
                if (bank.getCode() == 1) {
                    Log.w("guanzhu", response.body());
                    if (bank.getData().getIsFollow() == 0) {
                        Default.geshu = "0";
                    } else {
                        Default.geshu = "1";
                    }
                    tvGuankanRenshu.setText(bank.getData().getFansCount() + "");
                } else if (bank.getCode() == 401) {
                    SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
                    SharedPreferences.Editor edit = sPreferences.edit();
                    edit.putString("userid", "");
                    edit.putString("token", "");
                    edit.putString("name", "");
                    edit.commit();
                    finish();
                    ToastUtils.showToast("请重新登录");
                    startActivity(new Intent(PreviewActivity.this, LoginActivity.class));
                } else {
                    Toast.makeText(PreviewActivity.this, bank.getMsg(), Toast.LENGTH_SHORT).show();

                }
            }
        });
    }

    private void start_zhibo() {
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        HashMap<String, String> hash = new HashMap<>();
        hash.put("registrationId", JPushInterface.getRegistrationID(PreviewActivity.this));
        String str = new String();
        str = new Gson().toJson(hash);
        OkGo.<String>post(HttpUtils.url + "/tel/live/startRoom").headers("authorization", mytoken).upJson(str).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                GuanZhuRenshuModel bank = new GuanZhuRenshuModel();
                bank = new Gson().fromJson(response.body(), GuanZhuRenshuModel.class);
                if (bank.getCode() == 1) {
                    init();
                    countDownTimer.start();


                }
            }

            @Override
            public void onError(Response<String> response) {
                super.onError(response);
                ToastUtils.showToast("网络不给力,获取数据失败");
            }
        });
    }


    private CountDownTimer countDownTimer = new CountDownTimer(3000, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            String value = String.valueOf((int) (millisUntilFinished / 1000));
            tvDaojishi.setText(value);
        }

        @Override
        public void onFinish() {
            tvDaojishi.setVisibility(View.GONE);
            tvDaojishi.setVisibility(View.GONE);
            mPublisher.startPublish(rtmpUrl);
  
            publish.setText("暂停");
            mPublisher.startCamera();
            rlzhunbei.setVisibility(View.GONE);
            kaishizhibo.setVisibility(View.VISIBLE);
            if (swEnc.getText().toString().contentEquals("soft encoder")) {
            } else {
            }
            swEnc.setEnabled(false);
            pause.setEnabled(true);
        }
    };


    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case REQUEST_CODE:
                if (requestCode == Activity.RESULT_OK) {
                    try {
                        ScreenUtil.setUpData(resultCode, data);
                        ScreenUtil.getScreenRecordFilePath();
                        finalFile = new File(ScreenUtil.getScreenRecordFilePath());

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    Toast.makeText(PreviewActivity.this, "拒绝录屏", Toast.LENGTH_SHORT).show();
                }
                break;
            case TAKE_PHOTO:
                if (resultCode == RESULT_OK) {
                    beginCrop(imageUri);

                }
                break;
            case CHOOSE_PHOTO:
                if (resultCode == RESULT_OK) {
                    if (Build.VERSION.SDK_INT >= 19) {
                        handleImageOnKatKit(data);
                    } else {
                        handleImageBeforKatKit(data);
                    }
                }
                break;
            case NAME:
                if (resultCode == RESULT_OK) {
                    String name = data.getStringExtra("name");
                }
                break;
            case Crop.REQUEST_PICK:
                if (resultCode == RESULT_OK) {
                    beginCrop(data.getData());
                }
                break;
            case Crop.REQUEST_CROP:
                handleCrop(resultCode, data);
                break;
        }
    }


    // 将裁剪回来的数据进行处理
    private void handleCrop(int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            ivZhaopian.setImageURI(null);
            Uri uri = Crop.getOutput(data);
            try {
                finalFile = new File(ImageUtils.saveBitmap(PreviewActivity.this, uri.getPath()));
                image = Uri.fromFile(finalFile);
                Picasso.with(PreviewActivity.this).load(image).into(ivZhaopian);

                shangchuan();
                Log.i("image", "finalFile=" + finalFile.getAbsolutePath());
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (resultCode == Crop.RESULT_ERROR) {
        }
    }

    private void shangchuan() {
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        OkGo.<String>post(HttpUtils.url + "/tel/file/upload").headers("authorization", mytoken).params("file", finalFile).isMultipart(true).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                Map mapTypes = JSON.parseObject(response.body());
                for (Object obj : mapTypes.keySet()) {
                    if (obj.equals("data")) {
                        System.out.println("key为:" + obj + "值为:" + mapTypes.get(obj));
                        Map mapTypes1 = JSON.parseObject(String.valueOf(mapTypes.get(obj)));
                        for (Object obj1 : mapTypes1.keySet()) {
                            System.out.println("key为:" + obj1 + "值为:" + mapTypes1.get(obj1));
                            lujing = mapTypes1.get(obj1).toString();
                        }
                    }
                }
            }

            @Override
            public void onError(Response<String> response) {
                super.onError(response);
                ToastUtils.showToast("网络不给力,获取数据失败");
            }
        });
//
    }

    // 开始裁剪
    private void beginCrop(Uri uri) {
        Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped.jpg"));
        // start() 方法根据其的需求选择不同的重载方法
        Crop.of(uri, destination).withMaxSize(200,200).start(this);
    }


    private void handleImageBeforKatKit(Intent data) {
        Uri uri = data.getData();
        String imagePath = getImagePath(uri, null);
        disPlayImage(imagePath);
    }

    @TargetApi(19)
    private void handleImageOnKatKit(Intent data) {
        String imagePath = null;
        Uri uri = data.getData();
        if (DocumentsContract.isDocumentUri(PreviewActivity.this, uri)) {
            //  如果是Document类型的uri,则通过Document  Id处理
            String docId = DocumentsContract.getDocumentId(uri);
            if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
                String id = docId.split(":")[1];
                String selection = MediaStore.Images.Media._ID + "=" + id;
                imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
            } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
                Uri contentUri = ContentUris.withAppendedId(Uri.parse(
                        "content://downloads/public/_downloads"), Long.valueOf(docId));
                imagePath = getImagePath(contentUri, null);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {
            //如果是content类型的uri,则使用普通方式处理
            imagePath = getImagePath(uri, null);
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {
            //如果是file类型的uri,则直接获取图片路径即可
            imagePath = uri.getPath();
        }
        disPlayImage(imagePath);
    }

    private void disPlayImage(String imagePath) {
        if (imagePath != null) {
            Uri uri = Uri.fromFile(new File(imagePath));
            beginCrop(uri);
        } else {
            Toast.makeText(PreviewActivity.this, "图片选取失败", Toast.LENGTH_SHORT).show();
        }
    }

    private String getImagePath(Uri uri, String selection) {
        String path = null;
        //通过uri和selection来获取图片的真是路径
        Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }
            cursor.close();
        }
        return path;
    }

    private void 个人资料() {
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        OkGo.<String>get(HttpUtils.url + "/tel/userInfo/getUserInfo").headers("authorization", mytoken).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                Log.e("login", response.body());

                Map mapTypes = JSON.parseObject(response.body());
                for (Object obj : mapTypes.keySet()) {
                    if (obj.equals("data")) {
                        System.out.println("key为:" + obj + "值为:" + mapTypes.get(obj));
                        Map mapTypes1 = JSON.parseObject(String.valueOf(mapTypes.get(obj)));
                        for (Object obj1 : mapTypes1.keySet()) {
                            System.out.println("key为:" + obj1 + "值为:" + mapTypes1.get(obj1));
                            keylist.add(obj1.toString());
                            viuelist.add(mapTypes1.get(obj1).toString());
                        }
                        for (int i = 0; i < keylist.size(); i++) {
                            if (keylist.get(i).equals("nickName")) {
                                nicheng = viuelist.get(i);
                            } else if (keylist.get(i).equals("headPic")) {
                                tupian = viuelist.get(i);
                            }
                        }
                        if (tupian == null || tupian == "") {

                        } else{
                            Picasso.with(PreviewActivity.this).load(tupian)
                                    .memoryPolicy(MemoryPolicy.NO_CACHE)
                                    .networkPolicy(NetworkPolicy.NO_CACHE)
                                    .error(R.mipmap.cehua_touxiang)
                                    .into(civTouxiang);
                    }
                        if (nicheng.equals("") || nicheng == null) {
                            tvName.setText("请输入直播标题");
                        } else {
                            tvName.setText(nicheng);
                        }

                    }
                }
            }

            @Override
            public void onError(Response<String> response) {
                super.onError(response);
                ToastUtils.showToast("网络不给力,获取数据失败");
            }
        });
    }

    private void huoqufangjian2() {
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        OkGo.<String>get(HttpUtils.url + "/tel/live/getRoom" + "?type=ANDROID").headers("authorization", mytoken).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                if (response.body().contains("\"data\":null")) {
                    Toast.makeText(PreviewActivity.this, "该用户无直播权限", Toast.LENGTH_SHORT).show();
                } else {
                    Map mapTypes = JSON.parseObject(response.body());
                    for (Object obj : mapTypes.keySet()) {
                        if (obj.equals("data")) {
                            System.out.println("key为:" + obj + "值为:" + mapTypes.get(obj));
                            Map mapTypes1 = JSON.parseObject(String.valueOf(mapTypes.get(obj)));
                            for (Object obj1 : mapTypes1.keySet()) {
                                System.out.println("key为:" + obj1 + "值为:" + mapTypes1.get(obj1));
                                keylist.add(obj1.toString());
                                viuelist.add(mapTypes1.get(obj1).toString());
                            }
                            for (int i = 0; i < keylist.size(); i++) {
                                if (keylist.get(i).equals("roomPicUrl")) {
                                    tupian = viuelist.get(i);
                                } else if (keylist.get(i).equals("roomNo")) {
                                    fangjianhao = viuelist.get(i);
                                } else if (keylist.get(i).equals("onPublishUrl")) {
                                    rtmpUrl = viuelist.get(i);
                                } else if (keylist.get(i).equals("roomName")) {
                                    fangjianmingchneg = viuelist.get(i);
                                }
                            }
                            if (tupian != null || tupian != "") {
                                Picasso
                                        .with(PreviewActivity.this)
                                        .load(tupian)
                                        .placeholder(PreviewActivity.this.getResources().getDrawable(R.mipmap.zhanwei))//图片加载中显示
                                        .into(ivZhaopian);
                            }else {
                                Picasso
                                        .with(PreviewActivity.this)
                                        .load("111111")
                                        .placeholder(PreviewActivity.this.getResources().getDrawable(R.mipmap.zhanwei))//图片加载中显示
                                        .into(ivZhaopian);
                            }
                            Log.w("tuiliudizhi", rtmpUrl);
                            tvZhibobiaoti.setText(fangjianmingchneg);
                            tvName.setText(nicheng);

                        }
                    }
                }
            }

            @Override
            public void onError(Response<String> response) {
                super.onError(response);
                ToastUtils.showToast("网络连接失败");
            }
        });
    }

    //退出前询问
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            AlertDialog alertDialog = new AlertDialog.Builder(PreviewActivity.this)
                    .setTitle("提示")
                    .setMessage("小朋友正在赶来的路上 确认要退出吗?")
                    .setPositiveButton("继续退出", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO: 2018/4/16 positive
                            if (dianji == 1) {
                                mPublisher.stopPublish();
                                mPublisher.stopRecord();
                                guanbizhibo();
                            } else {
                                finish();
                            }
                        }
                    })
                    .setNegativeButton("再等等", new DialogInterface
                            .OnClickListener
                            () {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO: 2018/4/16 negative

                        }
                    })
                    .create();
            alertDialog.show();
            alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.GRAY);
            alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(Color.RED);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    private void guankanrenshu() {
        /**
         *  观看人数,关注人数
         */
        SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
        mytoken = sPreferences.getString("token", "");
        uuid = sPreferences.getString("userid", "");
        HashMap<String, String> hash = new HashMap<>();
        hash.put("anchorId", uuid);
        hash.put("roomNo", fangjianhao);
        String str = new String();
        str = new Gson().toJson(hash);
        OkGo.<String>get(HttpUtils.url + "/tel/live/getRoomOnlineMsg" + "?anchorId=" + uuid + "&roomNo=" + fangjianhao).headers("authorization", mytoken).execute(new StringCallback() {
            @Override
            public void onSuccess(Response<String> response) {
                GuanZhuRenshuModel bank = new GuanZhuRenshuModel();
                bank = new Gson().fromJson(response.body(), GuanZhuRenshuModel.class);
                if (bank.getCode() == 1) {
                    Log.w("22222", response.body());
                    tvZaixinRenshu.setText(bank.getData().getPeopleCount() + "");
                    guankanlist = bank.getData().getOnLinePeopleList();
                    adapter1 = new PicAdapter(PreviewActivity.this, R.layout.item_pic, guankanlist);
                    hlistTouxiang.setAdapter(adapter1);

                } else if (bank.getCode() == 401) {
                    SharedPreferences sPreferences = getSharedPreferences("Login", MODE_PRIVATE);
                    SharedPreferences.Editor edit = sPreferences.edit();
                    edit.putString("userid", "");
                    edit.putString("token", "");
                    edit.putString("name", "");
                    edit.commit();
                    finish();
                    ToastUtils.showToast("请重新登录");
                    startActivity(new Intent(PreviewActivity.this, LoginActivity.class));
                } else {
                    Toast.makeText(PreviewActivity.this, bank.getMsg(), Toast.LENGTH_SHORT).show();
                }
            }

        });
    }


    @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void onEvent2(TwoEvent event) {
        svgaImage.setVisibility(View.VISIBLE);
        String msg = event.getMsg();
        try {
            SVGAParser.Companion.shareParser().decodeFromURL(new URL(msg), new SVGAParser.ParseCompletion() {
                @Override
                public void onComplete(@NotNull SVGAVideoEntity videoItem) {
                    SVGADrawable drawable = new SVGADrawable(videoItem);
                    svgaImage.setImageDrawable(drawable);
                    svgaImage.startAnimation();
                }

                @Override
                public void onError() {
                }
            });
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
    @NetWork(netType = NetType.AUTO)
    public void network(NetType netType) {
        if(autoReconnect && error && NetworkUtils.isAvailable() ){
            mPublisher.stopCamera();
            publish();
            error = false;
        }
    }
    private void publish(){
        mPublisher.startPublish(rtmpUrl);
        mPublisher.startCamera();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值