
当我尝试使用“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.access0(StreamerActivity.java:46) at com.Google.androID.apps.watchme.StreamerActivity.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://schemas.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.access0(StreamerActivity.java:47) at com.Google.androID.apps.watchme.StreamerActivity.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应用程序意外关闭所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)