android onclick为什么一定要有参数

为什么在java中实现写onclick方法的时候一定要写形参呢?如:
public void onClick(View v){}
如果没有参数v就会报错,这个是为什么呢?

5个回答

实现的关系 就像你在java里面有一个接口类 里面有一个带有参数的方法,你要实现这个方法那就必须要有参数,onclick方法一样的道理

很抱歉,第一次回答,格式太乱了,重新回答

1. 首先看View的文档,查onclick属性,方法说明中有这么一句

例如:如果你指定了 android:onClick="sayHello", 你必须声明一个 public void sayHello(View v) 方法

2. 然后,查看View源码,查找onclick属性相关的内容,你会找到这么些语句

    case R.styleable.View_onClick:
        final String handlerName = a.getString(attr);
        if (handlerName != null) {
        setOnClickListener(new DeclaredOnClickListener(this, handlerName));
        }
    break;

3. 当onclick后面方法名不为空时,传递DeclaredOnClickListener,接着跳转到这个接口中去

  public DeclaredOnClickListener(@NonNull View hostView, @NonNull String methodName) {
                    ......
        mMethodName = methodName;
    }

4. 我们只关心methodName是吧,那就Ctrl+F搜索mMethodName,你会找到这么些语句

  private void resolveMethod(@Nullable Context context, @NonNull String name) {
            ......
            final Method method = context.getClass().getMethod(mMethodName, View.class);//关键语句
            ......
    }

5. Java反射技术,配置View.class参数,作为查找Method的条件,这就是为什么需要带有View v参数了。

我也是一个Android初学者,希望上面的回答能解决你的疑惑,我的微信公众号:oogh,里面每隔两天会发一篇我原创的Android的文章,作为我学习的记录,如果你有兴趣,期待你的关注....

GongHao2014
gonghao2014 回复qq_41836446: 可以的
一年多之前 回复
qq_41836446
Vindicated_Rt 很有帮助,可以引用你的回答到我的博客中吗?
接近 2 年之前 回复

因为所有的VIew都继承自View类,他们只是实现了View类的Onclick方法而已

如果你的意思是在XML中将button添加onclick属性 ,然后在Java中实现该onclick方法的话。那肯定是需要View,点击事件,你点击的实际上是一个实体的View,必须传入相应的View才能正确处理对你点击的View的事件响应。

  1. 首先看View的文档,查onclick属性,方法说明中有这么一句
    例如:如果你指定了 android:onClick="sayHello", 你必须声明一个 public void sayHello(View v) 方法

  2. 然后,查看View源码,查找onclick属性相关的内容,你会找到这么些语句

``` case R.styleable.View_onClick:
final String handlerName = a.getString(attr);
if (handlerName != null) {
setOnClickListener(new DeclaredOnClickListener(this, handlerName));
}
break;


3.  当onclick后面方法名不为空时,传递DeclaredOnClickListener,接着跳转到这个接口中去


     public DeclaredOnClickListener(@NonNull View hostView, @NonNull String methodName) {
                    ......
        mMethodName = methodName;
    }
我们只关心methodName是吧,那就Ctrl+F搜索mMethodName,你会找到这么些语句



 private void resolveMethod(@Nullable Context context, @NonNull String name) {
            ......
            final Method method = context.getClass().getMethod(mMethodName, View.class);//关键语句
            ......
Java反射技术,配置View.class参数,作为查找Method的条件,这就是为什么需要带有View v参数了。


我也是一个Android初学者,希望上面的回答能解决你的疑惑,我的微信公众号:oogh,里面每隔两天会发一篇我原创的Android的文章,作为我学习的记录,如果你有兴趣,期待你的关注....





GongHao2014
gonghao2014 第一次回答,格式太乱了,抱歉抱歉
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
使用Android studio编写的程序,写好代码后运行app到模拟器的时候会闪退
希望懂的大佬能帮帮忙,救救我,这个问题困扰我好久了,这个问题没解决就无法进行下一步。 1.最近使用Android studio编写了一个程序,写好代码后运行app到模拟器的时候会闪退(创建时程序版本和模拟器版本相同为5.1)。没有写代码时(也就是刚创建好程序,没添加任何东西时),在模拟器中能正常运行,但是当我写好代码后,运行app到模拟器上就会闪退了。 2.在代码部分,我是根据的SuperMap iMobile 9D(2019) for Android Guide的指导书写的,现在我也配置了许可,但还是会闪退 3.各个部分的代码如下: ``` <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.loadscence"> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation|screenSize" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <supports-screens android:largeScreens="true" android:resizeable="true" android:normalScreens="true" android:anyDensity="true"/> </manifest> ///////////////////////////////////////////////////////////这是mainactivity.java的代码 package com.example.loadscence; import androidx.appcompat.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ZoomControls; import com.supermap.data.Environment; import com.supermap.data.Workspace; import com.supermap.data.WorkspaceConnectionInfo; import com.supermap.data.WorkspaceType; import com.supermap.mapping.MapControl; import com.supermap.mapping.MapView; public class MainActivity extends AppCompatActivity { private MapControl m_mapcontrol = null; private Workspace m_workspace; private MapView m_mapView; private ZoomControls m_zoom; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置一些系统需要用到的路径 String rootPath = android.os.Environment.getExternalStorageDirectory().getAbsolutePath(); Environment. setLicensePath (rootPath + "/SuperMap/license/"); Environment. setTemporaryPath (rootPath + "/SuperMap/temp/"); Environment. setWebCacheDirectory (rootPath + "/SuperMap/WebCatch"); //组件功能必须在 Environment 初始化之后才能调用 Environment. initialization (this); //如果机器中默认不包括需要显示的字体,可以把相关字体文件放在参数所代表的路径中。 //例如,如果需要显示阿拉伯文字(若机器中原先不包括相关字体文件),可以把需要的字体文件放在参数所代表的路径中。 Environment. setFontsPath (rootPath + "/SuperMap/fonts/"); setContentView(R.layout. activity_main ); //打开工作空间 m_workspace = new Workspace(); WorkspaceConnectionInfo info = new WorkspaceConnectionInfo(); info.setServer(rootPath + "/SampleData/GeometryInfo/World.smwu"); info.setType(WorkspaceType. SMWU ); m_workspace.open(info); //将地图显示控件和工作空间关联 m_mapView = (MapView)findViewById(R.id. Map_view ); m_mapcontrol = m_mapView.getMapControl(); m_mapcontrol.getMap().setWorkspace(m_workspace); //打开工作空间中的第二幅地图 String mapName = m_workspace.getMaps().get(1); m_mapcontrol.getMap().open(mapName); m_zoom = (ZoomControls)findViewById(R.id. zoomControls1 ); m_mapView = (MapView)findViewById(R.id. Map_view ); m_zoom.setIsZoomInEnabled(true); m_zoom.setIsZoomOutEnabled(true); //放大按钮 m_zoom.setOnZoomInClickListener(new OnClickListener() { public void onClick(View v) { m_mapcontrol.getMap().zoom(2); m_mapcontrol.getMap().refresh(); } }); //缩小按钮 m_zoom.setOnZoomOutClickListener(new OnClickListener(){ public void onClick(View v) { m_mapcontrol.getMap().zoom(0.5); m_mapcontrol.getMap().refresh(); } }); m_mapcontrol.getMap().refresh(); } } ///////////////////////////////////////////////////////////这是activity的代码 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main"> <RelativeLayout android:gravity="left" android:layout_width="match_parent" android:layout_height="match_parent"> <com.supermap.mapping.MapView android:id = "@+id/Map_view" android:layout_width="match_parent" android:layout_height = "match_parent"> </com.supermap.mapping.MapView> <ZoomControls android:id="@+id/zoomControls1" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> </ZoomControls> </RelativeLayout> </RelativeLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> ///////////////////////////////////////////////////////////报错日志如下: 03-23 22:32:10.438 22856-22856/com.example.loadscence E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.loadscence, PID: 22856 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.loadscence/com.example.loadscence.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to get length of null array at com.supermap.data.Environment.checkAndLoadLibrary64(Environment.java:1632) at com.supermap.data.Environment.initialization(Environment.java:576) at com.example.loadscence.MainActivity.onCreate(MainActivity.java:33) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  at android.app.ActivityThread.access$800(ActivityThread.java:151)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5254)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  ```
Android DataBinding 当中,如何传入方法参数
``` <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="cityModel" type="com.li_xyz.mvvm.viewmodel.CityModel" /> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="20dp"> <EditText android:id="@+id/cityName" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/search" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/cityName" android:onClick="这里该怎么写?" android:text="查询" /> </RelativeLayout> </layout> ``` CityModel 当中有一个 search(String cityName) 方法 想要实现的结果是,点击按钮,调用 search 方法,同时将 EditText 输入的内容作为参数传入 Button 的 android:onClick 该怎么写呢? DataBinding 刚学了一点儿皮毛,不是很了解,请大神赐教
android studio 调用 webservice 莫名闪退
编译的APP,电机按钮就会闪退! 下面是代码,求助看看有没有问题! ``` package com.zt.lesson2_4; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import android.widget.Button; import android.widget.EditText; import android.view.View.OnClickListener; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.os.AsyncTask; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MainActivity extends AppCompatActivity { private String result1; private TextView textView1; private TextView textView2; private TextView textView3; private EditText editText1; private Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView1=(TextView)findViewById(R.id.textView2 ); textView2=(TextView)findViewById(R.id.textView4 ); textView3=(TextView)findViewById(R.id.textView6 ); editText1=(EditText)findViewById(R.id.editText); button1=(Button)findViewById(R.id.button); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { QueryTask newQuery=new QueryTask(); newQuery.execute(editText1.getText().toString()); } }); } private class QueryTask extends AsyncTask<String,Integer,String>{ @Override protected String doInBackground(String... params) { try{ getRemoteInfo(params[0]); } catch (Exception e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { textView3.setText("返回数据是:\n\r" + result1); Pattern pattern1 = Pattern.compile("string=(.+?);"); Matcher matcher1 = pattern1.matcher(result1); int j = 0; String[] strings = new String[5]; while (matcher1.find()) { strings[j] = matcher1.group(); j = j + 1; } textView1.setText(strings[3].substring(7)); textView2.setText(strings[1].substring(7)); } } private void getRemoteInfo(String en_word) throws Exception{ String Target_URI = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx"; String namespace = "http://WebXml.com.cn/";//namespace String methodName = "TranslatorString";//要调用的方法名称TranslatorString SoapObject request = new SoapObject(namespace, methodName); // 设置需调用WebService接口需要传入的参数wordKey request.addProperty("wordKey", en_word); //创建SoapSerializationEnvelope 对象,同时指定soap版本号 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER12); envelope.bodyOut = request;//由于是发送请求,所以是设置bodyOut envelope.dotNet = true; HttpTransportSE httpTransportSE = new HttpTransportSE(Target_URI); httpTransportSE.call(null, envelope);//调用 // 获取返回的数据 SoapObject object = (SoapObject) envelope.bodyIn; // 获取返回的结果 result1 = object.getProperty(0).toString(); } } ```
Android中DialogInterface.OnClickListener的问题
Android中DialogInterface.OnClickListener的覆写方法onClick(DialogInterface dialog, int which)里面的dialog参数有什么用?
android studio中关于v4包的问题?
**这是错误提示:** 错误: 对于add(int,ChatFragment), 找不到合适的方法 方法 FragmentTransaction.add(Fragment,String)不适用 (参数不匹配; int无法转换为Fragment) 方法 FragmentTransaction.add(int,Fragment)不适用 (参数不匹配; ChatFragment无法转换为Fragment) ![图片说明](https://img-ask.csdn.net/upload/202002/19/1582089418_48233.png) **代码图片** ![图片说明](https://img-ask.csdn.net/upload/202002/19/1582089670_644370.png) ![图片说明](https://img-ask.csdn.net/upload/202002/19/1582089596_474211.png) ![图片说明](https://img-ask.csdn.net/upload/202002/19/1582089602_315981.png) ** 下面是代码** ``` package com.uitest.administrator.shoulderby.activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.KeyEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.uitest.administrator.shoulderby.R; import com.uitest.administrator.shoulderby.fragment.HomeFragment; import com.uitest.administrator.shoulderby.fragment.JobFragment; import com.uitest.administrator.shoulderby.fragment.MeFragment; import com.uitest.administrator.shoulderby.fragment.ChatFragment; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; /* 主界面 */ public class MainActivity extends FragmentActivity { @Bind(R.id.fl_main_content) FrameLayout flMainContent; @Bind(R.id.iv_main_home) ImageView ivMainHome; @Bind(R.id.tv_main_home) TextView tvMainHome; @Bind(R.id.ll_main_home) LinearLayout llMainHome; @Bind(R.id.iv_main_job) ImageView ivMainJob; @Bind(R.id.tv_main_job) TextView tvMainJob; @Bind(R.id.ll_main_job) LinearLayout llMainJob; @Bind(R.id.iv_main_me) ImageView ivMainMe; @Bind(R.id.tv_main_me) TextView tvMainMe; @Bind(R.id.ll_main_me) LinearLayout llMainMe; @Bind(R.id.iv_main_chat) ImageView ivMainChat; @Bind(R.id.tv_main_chat) TextView tvMainChat; @Bind(R.id.ll_main_chat) LinearLayout llMainChat; private FragmentManager fragmentManager; private HomeFragment homeFragment; private MeFragment meFragment; private ChatFragment chatFragment; private JobFragment jobFragment; private FragmentTransaction transaction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); //初始化HOME界面,默认进入软件是HOME界面 fragmentManager=getSupportFragmentManager(); transaction = fragmentManager.beginTransaction(); homeFragment = new HomeFragment(); transaction.add(R.id.fl_main_content, homeFragment); transaction.commit(); } //设置点击监听事件 @OnClick({R.id.ll_main_home, R.id.ll_main_me,R.id.ll_main_chat, R.id.ll_main_job}) public void changeTab(View v) { transaction = fragmentManager.beginTransaction(); //设置隐藏Fragment/图片/颜色 hideFragment(); switch (v.getId()) { case R.id.ll_main_home: if (homeFragment == null) { homeFragment = new HomeFragment(); transaction.add(R.id.fl_main_content, homeFragment); } transaction.show(homeFragment); ivMainHome.setImageResource(R.drawable.bottom02); tvMainHome.setTextColor(getResources().getColor(R.color.home_back_selected)); break; case R.id.ll_main_job: if (jobFragment == null) { //当jobFragment不存在时,进行初始化 jobFragment = new JobFragment(); transaction.add(R.id.fl_main_content, jobFragment); //添加jobFragment } transaction.show(jobFragment); //显示jobFragment ivMainJob.setImageResource(R.drawable.bottom08); tvMainJob.setTextColor(getResources().getColor(R.color.home_back_selected)); break; case R.id.ll_main_chat: if (chatFragment == null) { chatFragment = new ChatFragment(); transaction.add(R.id.fl_main_content, chatFragment); } transaction.show(chatFragment); ivMainChat.setImageResource(R.drawable.bottom04); tvMainChat.setTextColor(getResources().getColor(R.color.home_back_selected)); break; case R.id.ll_main_me: if (meFragment == null) { meFragment = new MeFragment(); transaction.add(R.id.fl_main_content, meFragment); } transaction.show(meFragment); ivMainMe.setImageResource(R.drawable.bottom06); tvMainMe.setTextColor(getResources().getColor(R.color.home_back_selected)); break; } transaction.commit(); } //设置隐藏Fragment/图片/颜色 private void hideFragment() { if (homeFragment != null) { ivMainHome.setImageResource(R.drawable.bottom01); tvMainHome.setTextColor(getResources().getColor(R.color.home_back_unselected)); transaction.hide(homeFragment); } if (jobFragment != null) { ivMainJob.setImageResource(R.drawable.bottom07); tvMainJob.setTextColor(getResources().getColor(R.color.home_back_unselected)); transaction.hide(jobFragment); } if (chatFragment != null) { ivMainChat.setImageResource(R.drawable.bottom03); tvMainChat.setTextColor(getResources().getColor(R.color.home_back_unselected)); transaction.hide(chatFragment); } if (meFragment != null) { ivMainMe.setImageResource(R.drawable.bottom05); tvMainMe.setTextColor(getResources().getColor(R.color.home_back_unselected)); transaction.hide(meFragment); } } private boolean flag = true; //flag 用于判断是否是第一次点击返回键 private static final int WHAT_RESET_BACK = 1; private Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case WHAT_RESET_BACK: flag = true; break; } } }; //重写onKeyDown,当点击两次返回键退出程序 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && flag) { Toast.makeText(this, "再点击一次,退出当前应用", Toast.LENGTH_SHORT).show(); flag = false; handler.sendEmptyMessageDelayed(WHAT_RESET_BACK, 2000); //设置2s的延迟,用于处理flag的值 return true; } return super.onKeyDown(keyCode, event); } //为了避免内存泄漏,应该在Destroy()移除未被执行的消息 @Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacksAndMessages(null); } } ```
android onClickListener问题
我们都知道给View及其子类设置onClickListener的时候可以使用XML或者 View.setOnClickListener方法,但当一个Activity中控件比较多的时候,统一 管理是更好的选择。让Activity实现onClickListener,重写onClick方法,然后对 参数View的ID进行判断,分别进行不同的操作。我写了一个小DEMO,但是 OnClick事件在单击Button后没有触发,求助大神。 我的XML代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="92dp" android:text="@string/hello_world" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_alignParentTop="true" android:layout_marginTop="32dp" android:text="Button" /> </RelativeLayout> 我的Activity代码: package com.example.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity implements OnClickListener { Button btn; TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init(){ btn = (Button)findViewById(R.id.button1); txt = (TextView)findViewById(R.id.textView1); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button1: txt.setText("success!!"); break; } } } 理论上单击按钮后,TextView中的文字会发生变化,但真机测试结果无反应。
Could not execute method for android :onClicked
最近在学android的camera,在拍照按钮的点击事件中做了如下参数设置: ``` public void capture(View view){ if(mCamera!=null){ WindowManager manager= (WindowManager) getSystemService(Context.WINDOW_SERVICE); Display display=manager.getDefaultDisplay(); Log.i("capture",display.getWidth()+" "+display.getHeight()); Camera.Parameters parameters=mCamera.getParameters(); //设置拍照格式 parameters.setPictureFormat(PixelFormat.YCbCr_422_SP); //设置拍照大小 parameters.setPictureSize(213,350); //设置自动对焦 parameters.setFlashMode(Camera.Parameters.FOCUS_MODE_AUTO); mCamera.setParameters(parameters); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { mCamera.takePicture(null,null,mPictureCallback); } }); } } ``` 点击拍照按钮的时候程序崩溃了,出现如下的日志信息: ``` Process: com.example.vampire.facelearning, PID: 14489 java.lang.IllegalStateException: Could not execute method for android:onClick at android.view.View$DeclaredOnClickListener.onClick(View.java:4461) at android.view.View.performClick(View.java:5207) at android.view.View$PerformClick.run(View.java:21177) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5432) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:735) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.view.View$DeclaredOnClickListener.onClick(View.java:4456) at android.view.View.performClick(View.java:5207)  at android.view.View$PerformClick.run(View.java:21177)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5432)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:735)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)  Caused by: java.lang.RuntimeException: setParameters failed at android.hardware.Camera.native_setParameters(Native Method) at android.hardware.Camera.setParameters(Camera.java:2003) at com.example.vampire.facelearning.CustomCamera.capture(CustomCamera.java:85) at java.lang.reflect.Method.invoke(Native Method)  at android.view.View$DeclaredOnClickListener.onClick(View.java:4456)  at android.view.View.performClick(View.java:5207)  at android.view.View$PerformClick.run(View.java:21177)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5432)  at java.lang.reflect.Method.invoke(Native Method)  ``` 我把mCamera.setParameters(parameters);注析掉后程序就可以进行拍照了,但遇到了另一个问题。拍照获取的图片尺寸非常小:![图片说明](https://img-ask.csdn.net/upload/201604/02/1459603192_651468.png) 这是onPictureToken方法的实现方法: ``` private Camera.PictureCallback mPictureCallback=new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { //将数据写入SD卡的temp.png文件当中 File tempFile=new File("/sdcard/temp.png"); try { FileOutputStream fileOutputStream=new FileOutputStream(tempFile); fileOutputStream.write(data); fileOutputStream.close(); Intent intent=new Intent(CustomCamera.this,ResultAty.class); intent.putExtra("picPath",tempFile.getAbsolutePath()); startActivity(intent); CustomCamera.this.finish(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }; ``` 跳转到另一个activity来进行显示图片: ``` String path=getIntent().getStringExtra("picPath"); ImageView imageView= (ImageView) findViewById(R.id.pic); //对图像的显示角度进行调整 try { FileInputStream fis=new FileInputStream(path); //把图像转换成字节流 Bitmap bitmap=BitmapFactory.decodeStream(fis); Matrix matrix=new Matrix(); matrix.setRotate(90); //调整角度 bitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); imageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } ``` 麻烦各位大神给个提示,我自己debug了很久都没有找出问题所在,谢谢!
Android的DatePickerDialog的使用报错
使用了一个弹窗的日期选择器,可是设置参数的时候老报错,说没有相应的构造函数。但我明明就是按照需要的参数写的 ``` package com.example.love; import java.util.Calendar; import java.util.Date; import android.app.Activity; import android.app.ActionBar; import android.app.DatePickerDialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.DatePicker; import android.widget.ImageButton; import android.os.Build; public class MainActivity extends Activity { private ImageButton ib;//图标按钮 private Date nowtime;//当前时间 private Date time;//在一起的时间 private int nowyear;//当前的年份 private int year;//在一起的年份 private int nowmouth;//当前的月份 private int mouth;//在一起的月份 private int nowday;//当前的日期 private int day;//在一起的日期 private int hour;//现在的小时 private int muinet;//现在的分钟 private int ss;//现在的秒 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main1); //获取当前的时间 Calendar date = Calendar.getInstance(); nowyear = date.get(date.YEAR); nowmouth = date.get(date.MONTH); nowday = date.get(date.DAY_OF_MONTH); ib = (ImageButton) findViewById(R.id.imageButton); ib.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { new DatePickerDialog(this, new OnDateSetListener() { @Override public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) { // TODO 自动生成的方法存根 } }, nowyear, nowmouth, nowday).show(); }); } } ```
Android工程导入Eclipse运行问题
当我将Android studio中的文件导入到Eclipse中时,原本在Android studio中运行在真机上会加载网络图片,可是导入到Eclipse中却载入不了网络图片,而且进度条的样式也改变了。 MainAcitivity.java文件如下: package com.example.imagedemo; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends Activity implements View.OnClickListener { private static final String[] params={ "http://p0.so.qhimg.com/bdr/_240_/t013971ecacef25bf25.jpg", "http://p4.so.qhimg.com/t018349127914f495ce.jpg" }; private Button btnFirst; private ProgressBar progress; private Bitmap bitmap=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnFirst = (Button) findViewById(R.id.btnFirst); progress = (ProgressBar) findViewById(R.id.progress); btnFirst.setOnClickListener(this); } @Override public void onClick(View v) { progress.setVisibility(View.VISIBLE); progress.setMax(100); MyASyncTask task = new MyASyncTask(); task.execute(params); } public class MyASyncTask extends AsyncTask<String, Integer, Bitmap> { protected Bitmap doInBackground(String... params) { int read; byte[] chars = new byte[1024]; Bitmap bitmap=null; InputStream inputStream = null; try { URL url = new URL(params[0]); HttpURLConnection con=(HttpURLConnection) url.openConnection(); con.setDoInput(true);//如果不设置的话,默认是true,它的意思是如果需要读取url上网络的数据时,必须要设置成true con.connect(); inputStream=con.getInputStream();//先要获取目标URL的地址的输入流 bitmap= BitmapFactory.decodeStream(inputStream);//通过BitmapFactory的decodeStream方法解析输入流 while((read=inputStream.read(chars))!=-1) { read+=chars.length; publishProgress(read); try { Thread.sleep(1300); } catch (InterruptedException e) { e.printStackTrace(); } } inputStream.close(); } catch (MalformedURLException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } return bitmap; } @Override protected void onProgressUpdate(Integer... values) { //当publichProcess被调用以后,UI线程将调用这个有方法在界面上展示任务的情况,比如一个额进度条。这里是更新进度条 int value=values[0]; progress.setVisibility(View.VISIBLE); progress.setBackgroundColor(Color.YELLOW); progress.setProgress(value); super.onProgressUpdate(values); } /*在 onPostExecute(Result) 中是请求获得结果后更新UI部分。你会看到他的参数就是我们类中的类型参数。代码如下*/ protected void onPostExecute(Bitmap Result){ ImageView imgView = (ImageView)findViewById(R.id.image);; imgView.setImageBitmap(Result); progress.setVisibility(View.VISIBLE); /*不显示进度条,当图片加载进来后,立马就占了进度条的位置*/ btnFirst.setText("图片下载完毕"); } } } 布局文件如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnFirst" android:text="开始下载"/> <ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/progress" android:visibility="invisible" android:max="100" style="?android:attr/progressBarStyleHorizontal"/> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/image" /> </LinearLayout> ``` ```
多个按钮和OnClickListeners监听事件处理
在我的 XML布局文件中有16个按钮(数字,加号,减号等)。 我想知道如何检查哪个按钮被按下? 我的想法是每个按钮都使用onClick()方法。但是这个方法有点不切实际,因为有16个按钮呢。我在网上搜索说可以在布局xml中使用android:onClick="function" 的参数。我不会在程序中运用,请问大家谁知道怎么处理多个按钮和OnClickListeners监听事件呢?
Android 蓝牙通信问题
安卓开发萌新。在做一个蓝牙通信的APP,现在打开蓝牙可以搜索到周围一开启蓝牙的设备,点击连接后,也会出现配对的窗口,但软件会出现闪退,不知是何问题。以下是源代码,希望各路大佬可以帮我解决一下这个问题,是否是线程未开启呢。是否是因为我已经设置与单片机通信的UUID的问题。 ``` package com.windfire; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class WindFireDemoActivity extends Activity implements OnClickListener { /** Called when the activity is first created. */ /*建立蓝牙适配器,搜索可连接设备,进行配对,*/ public static final int RECV_VIEW = 0; private BluetoothAdapter mBluetoothAdapter;//蓝牙适配器 private ArrayAdapter<String> deviceAdapter;//设备显示列表适配器 private ConnectThread connectthread; private List<String> listDevices; private ListView text;//显示需要配对设备 private Button parameterinput;//参数录入 private Button teststart;//开始测试 private Button search;//寻找设备按钮 private Button send;//发送按钮 private TextView datatest; private boolean sendflag = false; private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");//蓝牙串口服务 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(android.R.style.Theme_Black_NoTitleBar); setContentView(R.layout.main); initview();//实例化 initBroadcast();//初始化广播 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//获取本地蓝牙适配器,初始化蓝牙 //是否支持蓝牙功能 if(mBluetoothAdapter == null) { Toast.makeText(WindFireDemoActivity.this, "所持设备不支持蓝牙", Toast.LENGTH_SHORT).show(); } } /************************定义广播接收,查找设备,检查配对信息,添加到listDevices中*************************/ private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction();//服务发现远程设备时 String str = ""; if(BluetoothDevice.ACTION_FOUND.equals(action))//每扫描到一个设备,系统都会发送此广播 { //从Intent中获取device信息 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//获取搜索到的设备信息 str = device.getName()+ ":" + device.getAddress() + "\n"; //当发现的新设备不存在于设备配对列表中时,将设备的名字和地址添加到ArrayAdapter中 if(listDevices.indexOf(str) == -1)//防止重复添加 { listDevices.add(str);//添加搜索到的设备信息 deviceAdapter.notifyDataSetChanged(); } } else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { Toast.makeText(WindFireDemoActivity.this, "Discovery finished", Toast.LENGTH_SHORT).show(); } } }; /**************************************UI实例化*************************************************/ public void initview() { parameterinput =(Button)findViewById(R.id.input); teststart =(Button)findViewById(R.id.start); search =(Button)findViewById(R.id.button); send =(Button)findViewById(R.id.send); text = (ListView)findViewById(R.id.listView1); datatest = (TextView)findViewById(R.id.datatest); parameterinput.setOnClickListener(this); teststart.setOnClickListener(this); search.setOnClickListener(this); send.setOnClickListener(this); listDevices = new ArrayList<String>(); deviceAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, listDevices);//列表显示listDevices的设备名称及mac text.setAdapter(deviceAdapter); text.setOnItemClickListener( new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> adapterview, View view, int position,long id) { // TODO Auto-generated method stub //绑定所选择的蓝牙MAC地址设备 String str = deviceAdapter.getItem(position); if(null == str) { Toast.makeText(getApplicationContext(), "未选中设备", Toast.LENGTH_SHORT).show(); } String mac = str.substring(str.indexOf(":")+1).trim(); BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(mac);//以mac去创建一个device connectthread = new ConnectThread(device); connectthread.start(); Toast.makeText(getApplicationContext(), "连接到所选设备", Toast.LENGTH_SHORT).show(); } }); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()) { case R.id.input: Intent intent1 = new Intent(WindFireDemoActivity.this,parametershow.class); startActivity(intent1); break; case R.id.start: Intent intent2 = new Intent(WindFireDemoActivity.this,datashow.class); startActivity(intent2); break; case R.id.button: if(!mBluetoothAdapter.isEnabled()) { Intent enabler=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(enabler);//开启蓝牙 if (mBluetoothAdapter.isEnabled())//设置可见 { if (mBluetoothAdapter.getScanMode()!=BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 200); startActivity(discoverableIntent); } } } if (mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.cancelDiscovery(); Toast.makeText(getApplicationContext(), "Exit Discovery", Toast.LENGTH_SHORT).show(); } else//搜索未开始 { mBluetoothAdapter.startDiscovery();//开始搜索 Toast.makeText(getApplicationContext(), "Start Discovery", Toast.LENGTH_SHORT).show(); } break; case R.id.send: if(connectthread != null)//连接建立完成,准备发送指令开始通信 { try { sendflag = true; String str = "0x33"; connectthread.write(getHexBytes(str)); datatest.setText("send success"); } catch(Exception e) { e.printStackTrace(); } } else { Toast.makeText(WindFireDemoActivity.this, "未连接蓝牙设备", Toast.LENGTH_SHORT).show(); } break; } } /**************************************Broadcast初始化*************************************************/ public void initBroadcast(){ IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); registerReceiver(mReceiver,filter); } /**************************************连接线程*************************************************/ public class ConnectThread extends Thread { private BluetoothSocket btSocket; private InputStream in; private OutputStream out; //private BluetoothDevice btDev; public ConnectThread (BluetoothDevice device) { try { btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); } catch(IOException e) { e.printStackTrace(); } } public void run() { //发现服务会减慢连接建立速度,因此关闭掉 if(mBluetoothAdapter.isDiscovering()) { mBluetoothAdapter.cancelDiscovery(); }//退出搜索 try { //请求连接,该操作会阻塞线程 btSocket.connect(); Toast.makeText(WindFireDemoActivity.this, "连接建立", Toast.LENGTH_SHORT).show(); in = btSocket.getInputStream(); out = btSocket.getOutputStream(); if(sendflag) { new Thread(new Runnable(){ @Override public void run(){ byte[] buffer = new byte[1024]; int bytes; try{ while((bytes = in.read(buffer)) != -1) { String str = new String(buffer,"UTF-8"); str = str.substring(0, bytes); if(str.endsWith(" ")) { datatest.append(str); continue; } Bundle bundle = new Bundle(); Message message = new Message(); bundle.putString("recv", datatest.toString()); message.what = RECV_VIEW; message.setData(bundle); handler.sendMessage(message); } } catch(IOException e) { e.printStackTrace(); } } }).start(); } } catch(IOException e){ try{ btSocket.close(); } catch(IOException e1){ e1.printStackTrace(); } e.printStackTrace(); } } public void write(byte[] bytes) { try { out.write(bytes); } catch(IOException e) { e.printStackTrace(); } } public void cancel() { try { btSocket.close(); } catch (IOException e) { } } } /******************************************Handler处理message*************************************/ private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { Bundle bundle = null; switch(msg.what) { case RECV_VIEW: bundle = msg.getData(); String recv = bundle.getString("recv"); datatest.append(recv+"\n"); break; default: Toast.makeText(getApplicationContext(), "接受信息失败", Toast.LENGTH_SHORT).show(); /*case NOTICE_VIEW: bundle = msg.getData(); String notice = bundle.getString("notice"); datatest.append(notice);*/ break; } } }; public byte[] getHexBytes(String message) { int len = message.length() / 2; char[] chars = message.toCharArray(); String[] hexStr = new String[len]; byte[] bytes = new byte[len]; for (int i = 0, j = 0; j < len; i += 2, j++) { hexStr[j] = "" + chars[i] + chars[i + 1]; bytes[j] = (byte) Integer.parseInt(hexStr[j], 16); } return bytes; } @Override protected void onDestroy() { unregisterReceiver(mReceiver); super.onDestroy(); } } ``` 希望尽快解答
android下载图片过大导致报错
package tarena.day2801; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.Menu; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; public class MainActivity extends Activity { private Button button; private ImageView img; private String image_Path = "http://2.javatl.sinaapp.com/images/51d8c1d77fed4.jpg"; private ProgressDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button1); img = (ImageView) findViewById(R.id.imageView1); LinearLayout rl = (LinearLayout) findViewById(R.id.lr); ImageView img = new ImageView(this); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int height = dm.heightPixels/3; int width = dm.widthPixels / 2; LayoutParams params = new LayoutParams(width, height); img.setLayoutParams(params); rl.setGravity(Gravity.CENTER); img.setImageResource(R.drawable.ic_launcher); dialog = new ProgressDialog(this); dialog.setTitle("提示信息"); dialog.setMessage("正在下载,请稍候..."); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub new MYTask().execute(image_Path); } }); } /** * 使用异步任务的规则: 1、申明的类继承AsyncTask 标注三个参数的类型 * 2、第一个参数表示要执行的任务,通常是网络的路径;第二个参数表示进度的刻度,第三个参数表示任务执行的返回结果 * * @author liende * */ public class MYTask extends AsyncTask<String, Void, Bitmap> { /** * 表示任务执行之前的操作 */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog.show(); } /** * 主要是完成耗时的操作 */ @Override protected Bitmap doInBackground(String... arg0) { // TODO Auto-generated method stub // 使用网络连接类HttpClient类王城对网络数据的提取 HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(arg0[0]); Bitmap bitmap = null; try { HttpResponse httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { HttpEntity httpEntity = httpResponse.getEntity(); byte[] data = EntityUtils.toByteArray(httpEntity); bitmap = BitmapFactory .decodeByteArray(data, 0, data.length); ## **//在这里调用压缩方法** bitmap = compressImage(bitmap); } } catch (Exception e) { // TODO: handle exception } return bitmap; } /** * 主要是更新UI的操作 */ @Override protected void onPostExecute(Bitmap bitmap) { // TODO Auto-generated method stub super.onPostExecute(bitmap); Bitmap bmcopy = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); Paint paint = new Paint(); Canvas canvas = new Canvas(bmcopy); Matrix mt = new Matrix(); mt.setRotate(30, bmcopy.getWidth()/2, bmcopy.getHeight()/2); //mt.setScale(0.5f, 2); canvas.drawBitmap(bitmap, mt, paint); img.setImageBitmap(bmcopy); dialog.dismiss(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } ** //图片压缩方法** private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩 baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 options -= 10;//每次都减少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 return bitmap; } } 明明调用了图片压缩方法,但是不知道为什么运行的时候还是崩溃
android activity 点击按钮跳转到另外一个布局xml 出错?
![这是activity类里面按钮点击方法,没有错](https://img-ask.csdn.net/upload/201903/26/1553605637_874799.png) 1、每次都需要重复写上图点击方法,于是想把它提取出来。于是就有下图: ![图片说明](https://img-ask.csdn.net/upload/201903/26/1553605891_175605.png) 图中的方法,参数:AppCompatActivity activity,本来应该传递的是EditActivity,但是不知道参数应该怎么写,必须能使用setContentView方法,(或者大神能够实现跳转功能也行)。 2、目前这样写,运行出错如下: 2019-03-25 22:54:50.441 4612-4612/com.example.beiwanglu E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.beiwanglu, PID: 4612 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249) at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182) at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) at com.example.beiwanglu.ViewUtil$2.onClick(ViewUtil.java:46) at android.view.View.performClick(View.java:5609) at android.view.View$PerformClick.run(View.java:22259) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 2019-03-25 22:54:50.443 546-960/system_process W/ActivityManager: Force finishing activity com.example.beiwanglu/.EditActivity 2019-03-25 22:54:50.469 546-591/system_process I/OpenGLRenderer: Initialized EGL, version 1.4 2019-03-25 22:54:50.469 546-591/system_process D/OpenGLRenderer: Swap behavior 1 3、有大神知道最后一个参数应该怎么写吗?
android 利用自带相机拍照 在现实出来
单独可以 放在项目里就不行 我也真的是无语了 就是在拍完照片 按完成的时候报错的 上代码 package com.android.workapp; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnClickListener; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.StrictMode; import android.provider.MediaStore; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class Person_data_touxiang extends Activity { private static final int PHOTO_CAPTURE = 1; private static final int PHOTO_CAPTURE1 = 2; private static String photoPath = "/sdcard/AnBo/"; private static String photoName = ""; private Button photo, sc_photo,sc_img; private ImageView img_photo; private Bitmap upbitmap; //private String newName = "laoli.jpg"; //private String uploadFile = "/sdcard/AnBo/laol.jpg"; //private String actionUrl = "http://192.168.1.109:8080/Photo/photoServlet"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_person_data_touxiang); sc_img = (Button) findViewById(R.id.p_img);//本地 sc_img.setOnClickListener(new sc_img()); photo = (Button) findViewById(R.id.photo);//拍照 sc_photo = (Button) findViewById(R.id.sc_photo);//上传 sc_photo.setOnClickListener(new sc_photo()); img_photo = (ImageView) findViewById(R.id.imt_photo); // android.os.NetworkOnMainThreadException StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites() .detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy( new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath().build()); photo.setOnClickListener(new photo()); } // 本地 class sc_img implements View.OnClickListener { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intent, PHOTO_CAPTURE1); } } class sc_photo implements View.OnClickListener { @Override public void onClick(View arg0) { // TODO Auto-generated method stub dialog(); } } // 拍照 class photo implements View.OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File file = new File(photoPath); if (!file.exists()) { // 检查图片存放的文件夹是否存在 file.mkdir(); // 不存在的话 创建文件夹 } photoName=photoPath +System.currentTimeMillis() +".jpg"; File photo = new File(photoName); Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "image.jpg")); imageUri = Uri.fromFile(photo); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // 这样就将文件的存储方式和uri指定到了Camera应用中 startActivityForResult(intent, PHOTO_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); String sdStatus = Environment.getExternalStorageState(); switch (requestCode) { case PHOTO_CAPTURE: if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { Log.i("内存卡错误", "请检查您的内存卡"); } else { BitmapFactory.Options op = new BitmapFactory.Options(); // 设置图片的大小 System.out.println("a" +photoName); Bitmap bitMap = BitmapFactory.decodeFile(photoName); int width = bitMap.getWidth(); int height = bitMap.getHeight(); // 设置想要的大小 int newWidth = 480; int newHeight = 640; // 计算缩放比例 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 bitMap = Bitmap.createBitmap(bitMap, 0, 0, width, height, matrix, true); // canvas.drawBitmap(bitMap, 0, 0, paint) // 防止内存溢出 op.inSampleSize = 1; // 这个数字越大,图片大小越小. Bitmap pic = null; pic = BitmapFactory.decodeFile(photoName, op); img_photo.setImageBitmap(pic); // 这个ImageView是拍照完成后显示图片 FileOutputStream b = null; ; try { b = new FileOutputStream(photoName); } catch (FileNotFoundException e) { e.printStackTrace(); } if (pic != null) { pic.compress(Bitmap.CompressFormat.JPEG, 50, b); } } break; case PHOTO_CAPTURE1: if (data != null) { img_photo.setImageURI(data.getData()); System.out.println(getAbsoluteImagePath(data.getData())); System.out.println("1231"); } break; default: return; } } private String getAbsoluteImagePath(Uri data) { // TODO Auto-generated method stub String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(data, proj, // Which columns to return null, // WHERE clause; which rows to return (all rows) null, // WHERE clause selection arguments (none) null); // Order-by clause (ascending by name) int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } protected void dialog() { AlertDialog.Builder builder = new Builder(Person_data_touxiang.this); builder.setMessage("确认上传图片吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } /* 显示Dialog的method */ private void showDialog(String mess) { new AlertDialog.Builder(Person_data_touxiang.this).setTitle("提示").setMessage(mess) .setNegativeButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } ![图片说明](https://img-ask.csdn.net/upload/201601/25/1453723757_546688.png)
关于android 调用外部命令的问题(Runtime.getRuntime().exec参数)
android 调用外部命令的问题(Runtime.getRuntime().exec参数) 调用ls还有cat命名是没问题的,但是有些命令用不了,例如ll,打印显示环境有问题,不知道怎么解? 代码: private String ssss() { String TAG2 = "CMD"; try { String cmd="ls"; Process process =Runtime.getRuntime().exec(cmd); InputStream in1 = process.getInputStream(); BufferedReader reader1 = new BufferedReader(new InputStreamReader(in1)); String line1; Log.i(TAG2, "返回结果" + reader1.readLine()); while ((line1 = reader1.readLine()) != null) { Log.i(TAG2, "返回结果=" + line1); } in1.close(); } catch (IOException ex) { ex.printStackTrace(); // result2 = "N/A"; } return null; } String cmd="ls"打印结果: 644-644/com.example.MEM I/CMD﹕ 返回结果acct 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=config 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=d 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=default.prop 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=etc 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=init.goldfish.rc 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=init.recovery.sun7i.rc 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=init.sdb.rc 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=init.sdd.rc 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=init.sun7i.rc 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=init.trace.rc 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=initlogo.rle 03-23 16:42:56.157 644-644/com.example.MEM I/CMD﹕ 返回结果=nand.ko 03-23 16:42:56.167 644-644/com.example.MEM I/CMD﹕ 返回结果=proc 03-23 16:42:56.167 644-644/com.example.MEM I/CMD﹕ 返回结果=sbin 03-23 16:42:56.167 644-644/com.example.MEM I/CMD﹕ 返回结果=sun7i-ir.ko 03-23 16:42:56.167 644-644/com.example.MEM I/CMD﹕ 返回结果=system 03-23 16:42:56.167 644-644/com.example.MEM I/CMD﹕ 返回结果=ueventd.goldfish.rc 03-23 16:42:56.167 644-644/com.example.MEM I/CMD﹕ 返回结果=ueventd.sun7i.rc 03-23 16:42:56.167 644-644/com.example.MEM I/CMD﹕ 返回结果=null String cmd="ll"打印结果: 03-23 16:46:52.337 3166-3166/com.example.MEM W/System.err﹕ java.io.IOException: Error running exec(). Command: [ll] Working Directory: null Environment: null 03-23 16:46:52.337 3166-3166/com.example.MEM W/System.err﹕ at java.lang.ProcessManager.exec(ProcessManager.java:211) 03-23 16:46:52.347 3166-3166/com.example.MEM W/System.err﹕ at java.lang.Runtime.exec(Runtime.java:168) 03-23 16:46:52.347 3166-3166/com.example.MEM W/System.err﹕ at java.lang.Runtime.exec(Runtime.java:241) 03-23 16:46:52.347 3166-3166/com.example.MEM W/System.err﹕ at java.lang.Runtime.exec(Runtime.java:184) 03-23 16:46:52.347 3166-3166/com.example.MEM W/System.err﹕ at com.example.MEM.MyActivity.ssss(MyActivity.java:464) 03-23 16:46:52.347 3166-3166/com.example.MEM W/System.err﹕ at com.example.MEM.MyActivity.access$000(MyActivity.java:32) 03-23 16:46:52.347 3166-3166/com.example.MEM W/System.err﹕ at com.example.MEM.MyActivity$1.onClick(MyActivity.java:90)
Android WebView与Html交互问题
在Android App里,选择好参数,点击App内的一个Button后, 把参数传到部署在服务器上的html,html显示查询结果,该怎么实现呢? HTML ``` <%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>测试</title> <script type="text/javascript"> function Myonclick() { alert("触发了onclick事件!"); } function del() { alert("OK"); } function showFromHtml() { document.getElementById("id_input").value = "Java call Html"; } function showFromHtml2(param) { document.getElementById("id_input2").value = "Java call Html : " + param; } function JavacallHtml2(param) { document.getElementById("id_input2").value = "Javas call Html : " + param; } </script> </head> <body> <form id="form1" runat="server"> <input type="button" value="HtmlcallJava" onclick="showFromHtml()" /> <input type="button" value="HtmlcallJava2" onclick="showFromHtml2()" /> <input id="id_input" style="width: 90%" type="text" value="null" /> <br /> <input type="button" value="JavacallHtml" onclick="window.jsObj.JavacallHtml()" /> <br /> <input id="id_input2" style="width: 90%" type="text" value="null" /> <br/> <input type="button" value="JavacallHtml2" onclick="window.jsObj.JavacallHtml2()" /> </form> </body> </html> ``` Android ``` private static final String url = "http://xx.xx.x.xx/test/index.aspx"; private WebView mWebView; private String Msg = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web); Intent intent = getIntent(); Msg = intent.getStringExtra("jobno"); initView(); } private void initView() { mWebView = (WebView) findViewById(R.id.web); mWebView.setWebChromeClient(new WebChromeClient()); //或的WebView的Setting WebSettings settings = mWebView.getSettings(); //设置支持js,看方法名字就知道啥意思 settings.setJavaScriptEnabled(true); settings.setDefaultTextEncodingName("GBK");//设置字符编码 mWebView.setScrollBarStyle(0);//滚动条风格,为0指滚动条不占用空间,直接覆盖在网页上 mWebView.loadUrl("javascript:showInfoFromJava('" + Msg + "')"); //加载网页路径 mWebView.loadUrl(url); } ``` 上面的代码测试,无法获得从App传到THML的参数!
怎么把百度的鹰眼轨迹嵌入Android
请问百度的鹰眼轨迹怎么嵌入Android,Android不做展示只做记录,看了网上的教程,大部分都集成了百度地图,官网的教程又不能运行. 如下,getApplicationContext为空,请问是不能这么写,还是我的写法有问题,求教。。 最下面有错误信息 // 轨迹服务ID long serviceId = 111111; // 设备标识 String entityName = "Ly"; // 是否需要对象存储服务,默认为:false,关闭对象存储服务。注:鹰眼 Android SDK v3.0以上版本支持随轨迹上传图像等对象数据,若需使用此功能,该参数需设为 true,且需导入bos-android-sdk-1.0.2.jar。 boolean isNeedObjectStorage = false; // 初始化轨迹服务 mTrace = new Trace(serviceId, entityName, isNeedObjectStorage); // 初始化轨迹服务客户端 mTraceClient = new LBSTraceClient(getApplicationContext()); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { BaiduStart(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { End(); } }); } public void BaiduStart(){ // 定位周期(单位:秒) int gatherInterval = 5; // 打包回传周期(单位:秒) int packInterval = 10; // 设置定位和打包周期 mTraceClient.setInterval(gatherInterval, packInterval); mTraceClient.startTrace(mTrace, mTraceListener); mTraceClient.startGather(mTraceListener); } public void End(){ mTraceClient.stopTrace(mTrace, mTraceListener); } // 初始化轨迹服务监听器 OnTraceListener mTraceListener = new OnTraceListener() { @Override public void onBindServiceCallback(int i, String s) { } // 开启服务回调 @Override public void onStartTraceCallback(int status, String message) { Toast.makeText(getApplication(),"服务开启了"+message,Toast.LENGTH_LONG); } // 停止服务回调 @Override public void onStopTraceCallback(int status, String message) { Toast.makeText(getApplication(),"停止服务回调"+message,Toast.LENGTH_LONG); } // 开启采集回调 @Override public void onStartGatherCallback(int status, String message) { Toast.makeText(getApplication(),"开启采集回调"+message,Toast.LENGTH_LONG); } // 停止采集回调 @Override public void onStopGatherCallback(int status, String message) { Toast.makeText(getApplication(),"停止采集回调"+message,Toast.LENGTH_LONG); } // 推送回调 @Override public void onPushCallback(byte messageNo, PushMessage message) { Toast.makeText(getApplication(),"推送回调"+message,Toast.LENGTH_LONG); } @Override public void onInitBOSCallback(int i, String s) { } }; ![图片说明](https://img-ask.csdn.net/upload/201801/26/1516976830_529068.png)
Android拍视频预览的界面被拉伸
最近 Android 需要做一个拍视频保存然后上传的功能,基本功能实现了,但是有一个小 bug,就是预览的时候界面明显被拉长了,但是各种预览设置的参数也都试过了,都没有用,来请教一下。 #代码如下: ##1. Activity ``` public class RecordActivity extends AppCompatActivity implements SurfaceHolder.Callback { private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private Button btnStartStop; private boolean isRecording = false; // 标记是否已经在录制 private MediaRecorder mRecorder; // 音视频录制类 private Camera mCamera = null; // 相机 private List<Camera.Size> mSupportedPreviewSizes = null; private Camera.Size mPreviewSize; private Camera.Size mSize = null;// 相机的尺寸 private int mCameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK; // 默认后置摄像头 private static final SparseIntArray orientations = new SparseIntArray(); // 手机旋转对应的调整角度 static { orientations.append(Surface.ROTATION_0, 90); orientations.append(Surface.ROTATION_90, 0); orientations.append(Surface.ROTATION_180, 270); orientations.append(Surface.ROTATION_270, 180); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initWindow(); setContentView(R.layout.activity_record); initViews(); } /** * 初始化窗口 */ private void initWindow() { requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 设置全屏 // 设置竖屏显示 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 选择支持半透明模式,在有 surfaceView 的 activity 中使用。 getWindow().setFormat(PixelFormat.TRANSLUCENT); } /** * 视图对象初始化 */ private void initViews() { mSurfaceView = (SurfaceView) findViewById(R.id.surfaceview); btnStartStop = (Button) findViewById(R.id.btnStartStop); btnStartStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isRecording) { startRecord(); } else { stopRecord(); } } }); SurfaceHolder holder = mSurfaceView.getHolder(); // 取得holder holder.setFormat(PixelFormat.TRANSPARENT); holder.setKeepScreenOn(true); holder.addCallback(this); // holder加入回调接口 } /** * 初始化相机 */ private void initCamera() { /** * 默认打开后置摄像头 */ if (Camera.getNumberOfCameras() == 2) { mCamera = Camera.open(mCameraFacing); } else { mCamera = Camera.open(); } CameraSizeComparator sizeComparator = new CameraSizeComparator(); Camera.Parameters parameters = mCamera.getParameters(); if (mSize == null) { mSupportedPreviewSizes = parameters.getSupportedPreviewSizes(); Collections.sort(mSupportedPreviewSizes, sizeComparator); for (int num = 0; num < mSupportedPreviewSizes.size(); num++) { Camera.Size size = mSupportedPreviewSizes.get(num); if (size.width >= 1000 && size.height >= 1000) { this.mSize = size; break; } } mSize = mSupportedPreviewSizes.get(0); /** * 增加对聚焦模式的判断 */ List<String> focusModesList = parameters.getSupportedFocusModes(); if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); } else if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); } mCamera.setParameters(parameters); } int rotation = getWindowManager().getDefaultDisplay().getRotation(); int orientation = orientations.get(rotation); mCamera.setDisplayOrientation(orientation); } @Override protected void onResume() { super.onResume(); initCamera(); } @Override public void onPause() { releaseCamera(); super.onPause(); } /** * 开始录制 */ private void startRecord() { if (mRecorder == null) { mRecorder = new MediaRecorder(); // 创建MediaRecorder } if (mCamera != null) { mCamera.stopPreview(); mCamera.unlock(); mRecorder.setCamera(mCamera); } try { // 设置音频采集方式 mRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); // 设置视频的采集方式 mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); /* mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); // 设置文件的输出格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置audio的编码格式 mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); // 设置video的编码格式 mRecorder.setVideoEncodingBitRate(10 * 1024 * 1024); // 设置录制的视频编码比特率 mRecorder.setVideoFrameRate(30); // 设置录制的视频帧率 mRecorder.setVideoSize(1920, 1080); // 设置相机分辨率 */ // 设置要捕获的视频的宽度和高度 // mSurfaceHolder.setFixedSize(optimalSize.width, optimalSize.height); mRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); // 设置记录会话的最大持续时间(毫秒) mRecorder.setMaxDuration(180 * 1000); mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); /** * 获取外部路径,然后将视频保存进去 */ String path = Environment.getExternalStorageDirectory().getPath(); if (path != null) { File dir = new File(path + "/crafts_videos"); if (!dir.exists()) { dir.mkdir(); } /** * 将 currentTimeMillis() 作为文件名 */ path = dir + "/" + System.currentTimeMillis() + ".mp4"; mRecorder.setOutputFile(path); //设置输出文件的路径 mRecorder.prepare(); //准备录制 mRecorder.start(); //开始录制 isRecording = true; btnStartStop.setText("停止"); } } catch (Exception e) { e.printStackTrace(); } } /** * 停止录制 */ private void stopRecord() { try { mRecorder.stop(); // 停止录制 mRecorder.reset(); // 重置 btnStartStop.setText("开始"); } catch (Exception e) { e.printStackTrace(); } isRecording = false; } /** * 释放 MediaRecorder */ private void releaseMediaRecorder() { if (mRecorder != null) { mRecorder.release(); mRecorder = null; } } /** * 释放相机资源 */ private void releaseCamera() { try { if (mCamera != null) { mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.unlock(); mCamera.release(); } } catch (RuntimeException e) { } finally { mCamera = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; if (mCamera == null) { return; } try { //设置显示 mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); releaseCamera(); finish(); } } @Override public void surfaceCreated(SurfaceHolder holder) { // 将holder,这个holder为开始在onCreate里面取得的holder,将它赋给mSurfaceHolder mSurfaceHolder = holder; try { mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // surfaceDestroyed的时候同时对象设置为null if (isRecording && mCamera != null) { mCamera.lock(); } mSurfaceView = null; mSurfaceHolder = null; releaseMediaRecorder(); releaseCamera(); } private class CameraSizeComparator implements Comparator<Camera.Size> { public int compare(Camera.Size lhs, Camera.Size rhs) { if (lhs.width == rhs.width) { return 0; } else if (lhs.width > rhs.width) { return 1; } else { return -1; } } } } ``` ##2. 布局 ``` <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <SurfaceView android:id="@+id/surfaceview" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:id="@+id/btnStartStop" android:layout_width="60dp" android:layout_height="40dip" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:text="开始" /> </RelativeLayout> ``` ##3. 权限 ``` <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 求大神解答
以程序的方式从添加的按钮中获得OnClick()事件
我用以下代码添加了一些按钮: for (int i=0; i<XML.size(); i++) { //添加按钮 ToggleButton b = new ToggleButton(this); // 参数设置 lefttextv.setLayoutParams(lleft); b.setLayoutParams(bright); //自定义按钮 b.setOnClickListener(this); b.setId(id_button); System.out.println(id_button); b.setHeight(100); b.setWidth(200); // 作为子类添加到RelativeLayout布局 layouth.addView(lefttextv); layouth.addView(b); id_button++; } 但是如何获得OnClick()事件?我用以下的方法实现了View.OnClickListener事件: @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case id_button: Log.d("Button 0","Button 0 pressed); break; } } 但是运行不了,如何获得id?
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
立即提问