80,351
社区成员
发帖
与我相关
我的任务
分享
/** * 使用相机 */ private void useCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test/" + System.currentTimeMillis() + ".jpg"); file.getParentFile().mkdirs(); //改变Uri com.xykj.customview.fileprovider注意和xml中的一致 Uri uri = FileProvider.getUriForFile(this, "com.xykj.customview.fileprovider", file); //添加权限 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, REQUEST_CAMERA); } 网上别人写的方法,然后7.0不能直接拿uri,要用上面这种方式。大意是建一个文件,然后拿到这个文件的uri封装进intent里,这样相机拍的照片就直接存进你那个文件了,拿出来就直接读文件。之前你那个报IO错误我以为你拿到bitmap了
本地存的照片能转到服务器上吗?
/** * 使用相机 */ private void useCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test/" + System.currentTimeMillis() + ".jpg"); file.getParentFile().mkdirs(); //改变Uri com.xykj.customview.fileprovider注意和xml中的一致 Uri uri = FileProvider.getUriForFile(this, "com.xykj.customview.fileprovider", file); //添加权限 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, REQUEST_CAMERA); } 网上别人写的方法,然后7.0不能直接拿uri,要用上面这种方式。大意是建一个文件,然后拿到这个文件的uri封装进intent里,这样相机拍的照片就直接存进你那个文件了,拿出来就直接读文件。之前你那个报IO错误我以为你拿到bitmap了
[quote=引用 4 楼 Lone1yCode 的回复:]
[quote=引用 3 楼 x443137254 的回复:]
public void createFile(String flag) {
File file = new File(Environment.getExternalStorageDirectory(),
SD_APP_DIR_NAME);
Log.d(TAG, "定义File:" + file);
if (!file.exists()) {
file.mkdirs();
Log.d(TAG, "指定File不存在,创建目录");
try {
file.createNewFile();
Log.d(TAG, "创建新文件完成:" + file);
} catch (IOException e) {
e.printStackTrace();
}
}
想问一下这个file是文件还是文件夹?不知道能不能两个都创建,没试过
[quote=引用 3 楼 x443137254 的回复:] public void createFile(String flag) { File file = new File(Environment.getExternalStorageDirectory(), SD_APP_DIR_NAME); Log.d(TAG, "定义File:" + file); if (!file.exists()) { file.mkdirs(); Log.d(TAG, "指定File不存在,创建目录"); try { file.createNewFile(); Log.d(TAG, "创建新文件完成:" + file); } catch (IOException e) { e.printStackTrace(); } } 想问一下这个file是文件还是文件夹?不知道能不能两个都创建,没试过
public void createFile(String flag) { File file = new File(Environment.getExternalStorageDirectory(), SD_APP_DIR_NAME); Log.d(TAG, "定义File:" + file); if (!file.exists()) { file.mkdirs(); Log.d(TAG, "指定File不存在,创建目录"); try { file.createNewFile(); Log.d(TAG, "创建新文件完成:" + file); } catch (IOException e) { e.printStackTrace(); } } 想问一下这个file是文件还是文件夹?不知道能不能两个都创建,没试过
import static com.my.wordbar.R.id.rl_everyday;
import static com.my.wordbar.R.id.rl_review;
import static com.my.wordbar.R.id.rl_test;
import static com.my.wordbar.R.id.rl_translate;
import static com.my.wordbar.R.id.rl_word;
public class MainActivity extends BaseActivity implements View.OnClickListener, NavigationView.OnNavigationItemSelectedListener {
//Log Tag
private static final String TAG = "MainActivity";
private String mFilePath; //用于存储程序在外部储存卡的路径(根目录)
private String mPath; //用于存储最终目录,即根目录 / 要操作(存储文件)的文件夹
public static final String SD_APP_DIR_NAME = "WordBar"; //存储程序在外部SD卡上的根目录的名字
public static final String PHOTO_DIR_NAME = "photo"; //存储照片在根目录下的文件夹名字
public static final String VOICE_DIR_NAME = "voice"; //存储音频在根目录下的文件夹名字
public static final String VIDEO_DIR_NAME = "video"; //存储视频在根目录下的文件夹名字
public static final int PHOTO_RESULT_CODE = 100; //标志符,图片的结果码,判断是哪一个Intent
public static final int VOICE_RESULT_CODE = 101; //标志符,音频的结果码,判断是哪一个Intent
public static final int VIDEO_RESULT_CODE = 102; //标志符,视频的结果码,判断是哪一个Intent
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//设置屏幕不随手机旋转
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
//设置屏幕直向显示
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// android 7.0系统解决拍照的问题
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
}
/**
* 为标题栏按钮设置点击事件
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.main_bar_camera: {
//启动照相机
startCamera();
break;
}
case R.id.main_bar_recorder: {
Toast.makeText(this, "录音\n功能未完成", Toast.LENGTH_SHORT).show();
break;
}
case R.id.main_bar_settings: {
Intent intent = new Intent(MainActivity.this, SettingActivity.class);
startActivity(intent);
finish();
break;
}
case android.R.id.home: {
break;
}
}
return true;
}
/**
* 启动相机,首先获取权限,无权限不能使用,创建文件,并要求返回uri
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void startCamera() {
requestRunTimePermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA}, new PermissionListener() {
@Override
public void onGranted() {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
intent.addCategory(Intent.CATEGORY_DEFAULT);
//创建文件夹
createFile(PHOTO_DIR_NAME);
// 把文件地址转换成Uri格式
Uri uri = Uri.fromFile(new File(mPath));
//设置系统相机拍摄照片完成后图片文件的存放地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, PHOTO_RESULT_CODE);
}
@Override
public void onGranted(List<String> grantedPermission) {
Toast.makeText(MainActivity.this, "程序需要足够的权限才可以使用照相机!",
Toast.LENGTH_SHORT).show();
}
@Override
public void onDenied(List<String> deniedPermission) {
Toast.makeText(MainActivity.this, "程序需要足够的权限才可以使用照相机!",
Toast.LENGTH_SHORT).show();
}
});
}
/**
* 处理返回结果。
* 1、图片
* 2、音频
* 3、视频
*
* @param requestCode 请求码
* @param resultCode 结果码 成功 -1 失败 0
* @param data 返回的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Log.d(TAG, "请求码:"+requestCode+" 结果码:"+resultCode+" data:"+data);
switch (requestCode) {
case PHOTO_RESULT_CODE: {
Log.d(TAG, "结果返回:" + PHOTO_RESULT_CODE);
Bitmap bitmap = null;
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri uri = Uri.fromFile(new File(mPath));
intent.setData(uri);
this.sendBroadcast(intent);
savePhotoToSD(bitmap);
break;
}
case VOICE_RESULT_CODE: {
saveVoiceToSD();
break;
}
case VIDEO_RESULT_CODE: {
saveVideoTOSD();
break;
}
}
}
}
/**
* 保存照片到SD卡的指定位置
*/
private void savePhotoToSD(Bitmap bitmap) {
BufferedOutputStream os = null;
File file = new File(mPath, Calendar.getInstance().getTimeInMillis() + ".png");
Log.d(TAG, "保存的文件名:"+file);
if (file.exists()) {
file.delete();
Log.d(TAG, "文件已存在!删除!");
}
try {
file.createNewFile();
Log.d(TAG, "创建文件:"+file);
} catch (IOException e) {
e.printStackTrace();
}
try {
os = new BufferedOutputStream(new FileOutputStream(file));
bitmap.compress(Bitmap.CompressFormat.PNG, PHOTO_RESULT_CODE, os);
Log.d(TAG, "存储照片完成");
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.flush();
os.close();
Log.d(TAG, "刷新、关闭流");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 保存音频到SD卡的指定位置
*/
private void saveVoiceToSD() {
}
/**
* 保存视频到SD卡的指定位置
*/
private void saveVideoTOSD() {
}
/**
* 创建根目录和文件夹
*
* @param flag 传递过来的标志位,分为图片、音频、视频三种
*/
public void createFile(String flag) {
File file = new File(Environment.getExternalStorageDirectory(),
SD_APP_DIR_NAME);
Log.d(TAG, "定义File:" + file);
if (!file.exists()) {
file.mkdirs();
Log.d(TAG, "指定File不存在,创建目录");
try {
file.createNewFile();
Log.d(TAG, "创建新文件完成:" + file);
} catch (IOException e) {
e.printStackTrace();
}
}
mFilePath = file.getPath();
Log.d(TAG, "根目录的路径是:" + mFilePath);
File albumFile = null;
switch (flag) {
case PHOTO_DIR_NAME:
albumFile = new File(mFilePath, PHOTO_DIR_NAME);
Log.d(TAG, "创建图片目录:" + albumFile);
break;
case VOICE_DIR_NAME:
albumFile = new File(mFilePath, VOICE_DIR_NAME);
Log.d(TAG, "创建音频目录:" + albumFile);
break;
case VIDEO_DIR_NAME:
albumFile = new File(mFilePath, VIDEO_DIR_NAME);
Log.d(TAG, "创建视频目录:" + albumFile);
break;
}
if (!albumFile.exists()) {
albumFile.mkdir();
Log.d(TAG, "指定ablumFile不存在,创建目录:" + albumFile);
try {
albumFile.createNewFile();
Log.d(TAG, "创建新目录完成:" + albumFile);
} catch (IOException e) {
e.printStackTrace();
}
}
mPath = albumFile.getAbsolutePath();
Log.d(TAG, "创建的新文件夹的绝对路径是:" + mPath);
}
/**
* 加载toolbar文件
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//加载toolbar布局
getMenuInflater().inflate(R.menu.main_activity_toolbar, menu);
return true;
}
/**
* 让菜单同时显示图标和文字
*/
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
try {
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
method.setAccessible(true);
method.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return true;
}
}
导包也省了,文字太多不让发