Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Youtube看我Android应用程序意外关闭大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我从 https://github.com/youtube/yt-watchme创建android应用程序.

当我尝试使用“CREATE LIVE EVENT”按钮创建事件时.它会抛出一些跟随错误.我认为这是由于相机许可问题而发生的.

错误

09-17 11:43:53.582  32383-32383/com.google.android.apps.watchme E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.google.android.apps.watchme,PID: 32383
    java.lang.NoSuchMethodError: com.google.android.apps.watchme.StreamerActivity.checkSelfPermission
            at com.google.android.apps.watchme.StreamerActivity.startStreaming(StreamerActivity.java:174)
            at com.google.android.apps.watchme.StreamerActivity.access$200(StreamerActivity.java:46)
            at com.google.android.apps.watchme.StreamerActivity$1.onserviceConnected(StreamerActivity.java:63)
            at android.app.LoadedApk$serviceDispatcher.doConnected(LoadedApk.java:1110)
            at android.app.LoadedApk$serviceDispatcher$RunConnection.run(LoadedApk.java:1127)
            at android.os.Handler.handleCallBACk(Handler.java:733)
            at android.os.Handler.dispatchmessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5097)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

任何人请建议.我该如何解决这个问题.

提前致谢

代码更新:

清单文件XML

<manifest xmlns:android="http://scheR_120_11845@as.android.com/apk/res/android"
    package="com.google.android.apps.watchme">


    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- For authorization. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- For recording audio and video without going to lock. -->
    <uses-permission android:name="android.permission.RECORD_AUdio" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission."/>
    <uses-permission android:name="android.permission.CAMERA" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="true"></uses-feature>
    <uses-feature
        android:name="android.hardware.camera.front"
        android:required="true"></uses-feature>

    <application
        android:allowBACkup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@String/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.google.android.apps.watchme.MainActivity"
            android:configChanges="orientation|screenSize"
            android:label="@String/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.google.android.apps.watchme.StreamerActivity"
            android:label="@String/app_name"
            android:screenOrientation="landscape"></activity>

        <service android:name="com.google.android.apps.watchme.Streamerservice" />
    </application>
    <uses-sdk
        android:minSdkVersion="23"
        android:targetSdkVersion="23"/>
</manifest>

流活动文件

/*
 * Copyright (C) 2014 Google Inc.
 *
 * Licensed under the Apache License,Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in wriTing,software diStributed under the License
 * is diStributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.android.apps.watchme;

import android.Manifest;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.serviceConnection;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.bundle;
import android.os.IBinder;
import android.os.PoweRMANager;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.view.View;
import android.view.View.onClickListener;
import android.widget.ToggleButton;

import com.google.android.apps.watchme.util.Utils;
import com.google.android.apps.watchme.util.YouTubeApi;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Ibrahim Ulukaya <ulukaya@google.com>
 *         <p/>
 *         StreamerActivity class which previews the camera and streams via Streamerservice.
 */
public class StreamerActivity extends Activity {
    // CONSTANTS
    // TODO: Stop hardcoding this and read values from the camera's supported sizes.
    public static final int CAMERA_WIDTH = 640;
    public static final int CAMERA_HEIGHT = 480;
    private static final int requEST_CAMERA_MICROPHONE = 0;

    // Member variables
    private Streamerservice streamerservice;
    private serviceConnection streamerConnection = new serviceConnection() {
        @Override
        public void onserviceConnected(ComponentName className,IBinder servicE) {
            Log.d(MainActivity.APP_NAME,"onserviceConnected");

            streamerservice = ((Streamerservice.LocalBinder) servicE).getservice();

            restoreStateFromservice();
            startStreaming();
        }

        @Override
        public void onserviceDisconnected(ComponentName className) {
            Log.e(MainActivity.APP_NAME,"onserviceDisconnected");

            // This should never happen,because our service runs in the same process.
            streamerservice = null;
        }
    };
    private PoweRMANager.WakeLock wakeLock;
    private Preview preview;
    private String rtmpUrl;
    private String broadcastId;

    @Override
    public void onCreate(Bundle savedInstanceStatE) {
        Log.d(MainActivity.APP_NAME,"onCreate");
        super.onCreate(savedInstanceStatE);

        broadcastId = geTintent().getStringExtra(YouTubeApi.broaDCAST_ID_KEY);
        //Log.v(MainActivity.APP_NAME,broadcastId);

        rtmpUrl = geTintent().getStringExtra(YouTubeApi.RTMP_URL_KEY);

        if (rtmpUrl == null) {
            Log.w(MainActivity.APP_NAME,"No RTMP URL was passed in; bailing.");
            finish();
        }
        Log.i(MainActivity.APP_NAME,String.format("Got RTMP URL '%s' from calling activity.",rtmpUrl));

        setContentView(R.layout.streamer);
        preview = (Preview) findViewById(R.id.surfaceViewPreview);

        if (!bindservice(new Intent(this,Streamerservice.class),streamerConnection,BIND_AUTO_CREATE | BIND_DEBUG_UNBIND)) {
            Log.e(MainActivity.APP_NAME,"Failed to bind Streamerservice!");
        }

        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleBroadcasTing);
        toggleButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (toggleButton.ischecked()) {
                    streamerservice.startStreaming(rtmpUrl);
                } else {
                    streamerservice.stopStreaming();
                }
            }
        });
    }

    @Override
    protected void onResume() {
        Log.d(MainActivity.APP_NAME,"onResume");

        super.onResume();

        if (streamerservice != null) {
            restoreStateFromservice();
        }
    }

    @Override
    protected void onPause() {
        Log.d(MainActivity.APP_NAME,"onPause");

        super.onPause();

        if (preview != null) {
            preview.setCamera(null);
        }

        if (streamerservice != null) {
            streamerservice.releaseCamera();
        }
    }

    @Override
    protected void onDestroy() {
        Log.d(MainActivity.APP_NAME,"onDestroy");

        super.onDestroy();

        if (streamerConnection != null) {
            unbindservice(streamerConnection);
        }

        stopStreaming();

        if (streamerservice != null) {
            streamerservice.releaseCamera();
        }
    }

    private void restoreStateFromservice() {
        preview.setCamera(Utils.getCamera(Camera.CameraInfo.CAMERA_FACING_FRONT));
    }

    private void startStreaming() {
        Log.d(MainActivity.APP_NAME,"startStreaming");

        PoweRMANager pm = (PoweRMANager) getSystemservice(Context.POWER_serviCE);
        wakeLock = pm.newWakeLock(PoweRMANager.SCREEN_DIM_WAKE_LOCK,this.getClass().getName());
        wakeLock.acquire();

        if (!streamerservice.isStreaming()) {

            String cameraPermission = Manifest.permission.CAMERA;
            String microphonePermission = Manifest.permission.RECORD_AUdio;
            int hasCamPermission = checkSelfPermission(cameraPermission);
            int hasMicPermission = checkSelfPermission(microphonePermission);
            List<String> permissions = new ArrayList<String>();
            if (hasCamPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(cameraPermission);
                if (ActivityCompat.shouldShowrequestPermissionRationale(this,Manifest.permission.CAMERA)) {
                    // Provide rationale in Snackbar to request permission
                    Snackbar.make(preview,R.String.permission_camera_rationale,Snackbar.LENGTH_INDEFINITE).show();
                } else {
                    // Explain in Snackbar to turn on permission in setTings
                    Snackbar.make(preview,R.String.permission_camera_explain,Snackbar.LENGTH_INDEFINITE).show();
                }
            }
            if (hasMicPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(microphonePermission);
                if (ActivityCompat.shouldShowrequestPermissionRationale(this,Manifest.permission.RECORD_AUdio)) {
                    // Provide rationale in Snackbar to request permission
                    Snackbar.make(preview,R.String.permission_microphone_rationale,R.String.permission_microphone_explain,Snackbar.LENGTH_INDEFINITE).show();
                }
            }
            if (!permissions.isEmpty()) {
                String[] params = permissions.toArray(new String[permissions.size()]);
                ActivityCompat.requestPermissions(this,params,requEST_CAMERA_MICROPHONE);
            } else {
                // We already have permission,so handle as normal
                streamerservice.startStreaming(rtmpUrl);
            }
        }
    }

    /**
     * CallBACk received when a permissions request has been completed.
     */
    @Override
    public void onrequestPermissionsResult(int requestCode,String permissions[],int[] grantResults) {
        switch (requestCodE) {
            case requEST_CAMERA_MICROPHONE: {
                Log.i(MainActivity.APP_NAME,"Received response for camera with mic permissions request.");

                // We have requested multiple permissions for contacts,so all of them need to be
                // checked.
                if (Utils.verifyPermissions(grantResults)) {
                    // permissions were granted,yay! do the
                    // streamer task you need to do.
                    streamerservice.startStreaming(rtmpUrl);
                } else {
                    Log.i(MainActivity.APP_NAME,"Camera with mic permissions were NOT granted.");
                    Snackbar.make(preview,R.String.permissions_not_granted,Snackbar.LENGTH_SHORT)
                            .show();
                }
                break;
            }

            // other 'switch' lines to check for other
            // permissions this app might request
        }
        return;
    }


    private void stopStreaming() {
        Log.d(MainActivity.APP_NAME,"stopStreaming");

        if (wakeLock != null) {
            wakeLock.release();
            wakeLock = null;
        }

        if (streamerservice.isStreaming()) {
            streamerservice.stopStreaming();
        }
    }

    public void endEvent(View view) {
        Intent data = new Intent();
        data.putExtra(YouTubeApi.broaDCAST_ID_KEY,broadcastId);
        if (getParent() == null) {
            setResult(Activity.RESULT_OK,data);
        } else {
            getParent().setResult(Activity.RESULT_OK,data);
        }
        finish();
    }

}

更新错误代码

08:57:14.447  18829-18829/com.google.android.apps.watchme E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.google.android.apps.watchme,PID: 18829
    java.lang.UnsatisfiedLinkError: Couldn't load ffmpeg from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.google.android.apps.watchme-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.google.android.apps.watchme-1,/vendor/lib,/system/lib]]]: findLibrary returned null
            at java.lang.Runtime.loadLibrary(Runtime.java:358)
            at java.lang.System.loadLibrary(System.java:526)
            at com.google.android.apps.watchme.Ffmpeg.<clinit>(Ffmpeg.java:26)
            at com.google.android.apps.watchme.VideoStreamingConnection.open(VideoStreamingConnection.java:71)
            at com.google.android.apps.watchme.Streamerservice.startStreaming(Streamerservice.java:80)
            at com.google.android.apps.watchme.StreamerActivity.startStreaming(StreamerActivity.java:212)
            at com.google.android.apps.watchme.StreamerActivity.access$200(StreamerActivity.java:47)
            at com.google.android.apps.watchme.StreamerActivity$1.onserviceConnected(StreamerActivity.java:64)
            at android.app.LoadedApk$serviceDispatcher.doConnected(LoadedApk.java:1110)
            at android.app.LoadedApk$serviceDispatcher$RunConnection.run(LoadedApk.java:1127)
            at android.os.Handler.handleCallBACk(Handler.java:733)
            at android.os.Handler.dispatchmessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5097)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

解决方法

调用发生的活动代码中,用一个检查包装它:

int hasCamPermission = checkSelfPermission(cameraPermission);
int hasMicPermission = checkSelfPermission(microphonePermission);

首先将以下方法添加到StreamerActivity:

private Boolean shouldcheckForPermission() {
  return Build.VERSION.SDK_INT >= Build.VERSION_CODEs.M;
}

将这些行更改为:

int hasCamPermission = shouldcheckForPermission() ? checkSelfPermission(cameraPermission) : PackageManager.PERMISSION_GRANTED;
int hasMicPermission = shouldcheckForPermission() ? checkSelfPermission(microphonePermission) : PackageManager.PERMISSION_GRANTED;

为此,您需要使用SDK 23进行编译和定位,如上面的答案中所述.

大佬总结

以上是大佬教程为你收集整理的Youtube看我Android应用程序意外关闭全部内容,希望文章能够帮你解决Youtube看我Android应用程序意外关闭所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。