注意:android7.0與7.0以下版本獲取相機(jī)拍照后的照片的路徑的方式不同澎剥,具體代碼在給我的github上锡溯,地址為https://github.com/liang1075963999/android7.0
例一:?jiǎn)?dòng)相機(jī)拍一張照片,然后將照片顯示在imageview上哑姚,代碼如下:
public class MainActivity extends AppCompatActivity {
private Button button;
private ImageView imageView;
private Uri imageuri;
public static final int TAKE_PHOTO=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
imageView = (ImageView) findViewById(R.id.imageView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File file=new File(getExternalCacheDir(),"1.jpg");
Log.i("xinxi",getExternalCacheDir()+"");//輸出內(nèi)容為:/storage/emulated/0/Android/data/com.example.liang.myapplication/cache
if(file.exists()){//exists的中文意思是存在
file.delete();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if(Build.VERSION.SDK_INT>=24)
{
imageuri= FileProvider.getUriForFile(MainActivity.this,"com.example.liang.myapplication",file);//得到文件的uri
Log.i("xinxi",imageuri.toString());
}
else {
imageuri=Uri.fromFile(file);//我的手機(jī)只會(huì)執(zhí)行else里面的語(yǔ)句祭饭,說(shuō)明我的手機(jī)的sdk的版本小于24,因?yàn)槲业氖謾C(jī)是android6.0叙量,api是23倡蝙,只有android7.0及以上版本才會(huì)執(zhí)行以上的語(yǔ)句
Log.i("xinxi",imageuri.toString());//輸出結(jié)果為:file:///storage/emulated/0/Android/data/com.example.liang.myapplication/cache/1.jpg
}
Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");//啟動(dòng)相機(jī)的action是android.media.action.IMAGE_CAPTURE
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);//將照片的uri路徑寫入,照片就會(huì)保存在該路徑下
startActivityForResult(intent,TAKE_PHOTO);//使用startActivityForResult啟動(dòng)的活動(dòng)绞佩,在活動(dòng)啟動(dòng)之后會(huì)給原來(lái)的活動(dòng)返回一個(gè)結(jié)果碼寺鸥,這個(gè)結(jié)果碼在onActivityResult方法中接收,來(lái)判斷是否正常啟動(dòng)了
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case TAKE_PHOTO:
if(resultCode==RESULT_OK){
try {
Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(imageuri));//讀出路徑下圖片的流品山,然后轉(zhuǎn)換為bitmap
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
default:
}
}
}
因?yàn)閍ndroid7.0中得到一個(gè)文件的uri涉及到了content provider胆建,所以需要在androidmanifest中進(jìn)行配置,內(nèi)容如下:
device-2017-11-14-182630.png
例二:從相冊(cè)中選擇圖片
public class MainActivity extends AppCompatActivity {
private Button button;
private ImageView imageView;
private static final int CHOOSE_PHOTO = 2;//這里之所以是2肘交,是因?yàn)檫@個(gè)例子和例一其實(shí)是一起的笆载,但是我給分開(kāi)了,因?yàn)槔恢械腡AKE_PHOTO=1,所以這里要用2凉驻,加以區(qū)分
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
imageView = (ImageView) findViewById(R.id.imageView);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
qidong();
}
}
});
}
private void qidong() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");//啟動(dòng)手機(jī)內(nèi)容的action是android.intent.action.GET_CONTENT
intent.setType("image/*");//設(shè)置所需手機(jī)內(nèi)容為圖片
startActivityForResult(intent, CHOOSE_PHOTO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case CHOOSE_PHOTO:
if (resultCode == RESULT_OK) {
if (Build.VERSION.SDK_INT >= 19) {
//4.4.及以上版本使用這個(gè)方法處理圖片
one(data);
} else {
//4.4.以下版本使用這個(gè)方法處理圖片
another(data);
}
}
}
}
@TargetApi(19)
private void one(Intent intent) {
String imagepath = null;
Uri uri = intent.getData();
Log.i("xinxi", "intent.getData().toString()為:" + intent.getData().toString());
Log.i("xinxi", "uri.getAuthority()為:" + uri.getAuthority());
Log.i("xinxi", "uri.getScheme()為:" + uri.getScheme());
//Log日志如下:
/* 11-14 20:27:13.775 6291-6291/com.example.liang.myapplication I/xinxi: intent.getData().toString()為:content://com.android.providers.media.documents/document/image%3A756326
11-14 20:27:13.775 6291-6291/com.example.liang.myapplication I/xinxi: uri.getAuthority()為:com.android.providers.media.documents
11-14 20:27:13.775 6291-6291/com.example.liang.myapplication I/xinxi: uri.getScheme()為:content
11-14 20:27:13.785 6291-6291/com.example.liang.myapplication I/xinxi: DocumentsContract.getDocumentId(uri)為:image:756326
11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: intent.getData().toString()為:content://com.android.providers.media.documents/document/image%3A730538
11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: uri.getAuthority()為:com.android.providers.media.documents
11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: uri.getScheme()為:content
11-14 20:27:31.925 6291-6291/com.example.liang.myapplication I/xinxi: DocumentsContract.getDocumentId(uri)為:image:730538
11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: intent.getData().toString()為:content://com.android.providers.media.documents/document/image%3A124644
11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: uri.getAuthority()為:com.android.providers.media.documents
11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: uri.getScheme()為:content
11-14 20:28:07.195 6291-6291/com.example.liang.myapplication I/xinxi: DocumentsContract.getDocumentId(uri)為:image:124644*/
if (DocumentsContract.isDocumentUri(this, uri)) {
String docid = DocumentsContract.getDocumentId(uri);
Log.i("xinxi", "DocumentsContract.getDocumentId(uri)為:" + DocumentsContract.getDocumentId(uri));
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docid.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagepath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contenturi = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.parseLong(docid));
imagepath = getImagePath(contenturi, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
imagepath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
imagepath = uri.getPath();
}
showImage(imagepath);
}
private void another(Intent intent) {
Uri uri = intent.getData();
String imagepath = getImagePath(uri, null);
showImage(imagepath);
}
private void showImage(String imagepath) {
if (imagepath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagepath);
imageView.setImageBitmap(bitmap);
} else {
Toast.makeText(this, "沒(méi)有得到圖片", Toast.LENGTH_SHORT).show();
}
}
private String getImagePath(Uri externalContentUri, String selection) {
String path = null;
Cursor cursor = getContentResolver().query(externalContentUri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToNext()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
記得在androidmanifest中申明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
例三:簡(jiǎn)單的音樂(lè)播放器
device-2017-11-14-211121.png
public class MainActivity extends AppCompatActivity {
private Button button;
private Button button1;
private Button button2;
private MediaPlayer mediaplayer = new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
quanxian();
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!mediaplayer.isPlaying()) {
mediaplayer.start();
}
}
});
button1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
if (mediaplayer.isPlaying()) {
mediaplayer.pause();
}
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mediaplayer.isPlaying()) {
mediaplayer.reset();
chushihua();
}
}
});
}
private void quanxian() {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
chushihua();
}
}
private void chushihua() {
File file = new File(Environment.getExternalStorageDirectory(), "1.mp3");//要想得到手機(jī)存儲(chǔ)中任意文件的路徑就需要用到Environment腻要,如果是app的關(guān)聯(lián)緩存路徑的話直接getExternalCacheDir()
Log.i("xinxi", "Environment.getExternalStorageDirectory()為:" + Environment.getExternalStorageDirectory() + "");
Log.i("xinxi", "file.getPath()為" + file.getPath());
/* Log日志輸出如下:
11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: Environment.getExternalStorageDirectory()為:/storage/emulated/0
11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: file.getPath()為/storage/emulated/0/1.mp3*/
try {
mediaplayer.setDataSource(file.getPath());
mediaplayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//這個(gè)方法是當(dāng)系統(tǒng)提示用戶是否開(kāi)啟權(quán)限的時(shí),當(dāng)用戶選擇開(kāi)啟或者是禁止時(shí)觸發(fā)的
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case (1):
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)//grant是同意的意思涝登,grantResults這個(gè)參數(shù)中放的是0或者是1雄家,0表示同意,1表示禁止
{
Toast.makeText(MainActivity.this, "已經(jīng)有權(quán)限了", Toast.LENGTH_SHORT).show();
chushihua();
} else {
Toast.makeText(MainActivity.this, "請(qǐng)先申請(qǐng)權(quán)限", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mediaplayer!=null){
mediaplayer.stop();
mediaplayer.release();
}
}
}
記得在androidmanifest中申明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
例四:簡(jiǎn)單的視頻播放器
device-2017-11-14-212720.png
public class MainActivity extends AppCompatActivity {
private Button button;
private Button button1;
private Button button2;
private VideoView videoview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
videoview= (VideoView) findViewById(R.id.videoView);
quanxian();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!videoview.isPlaying()) {
videoview.start();//開(kāi)始播放
}
}
});
button1.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
if (videoview.isPlaying()) {
videoview.pause();//暫停播放
}
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (videoview.isPlaying()) {
videoview.resume();//重新播放
}
}
});
}
private void quanxian() {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
chushihua();
}
}
private void chushihua() {
File file = new File(Environment.getExternalStorageDirectory(), "mo.mp4");//要想得到手機(jī)存儲(chǔ)中任意文件的路徑就需要用到Environment胀滚,如果是app的關(guān)聯(lián)緩存路徑的話直接getExternalCacheDir()
Log.i("xinxi", "Environment.getExternalStorageDirectory()為:" + Environment.getExternalStorageDirectory() + "");
Log.i("xinxi", "file.getPath()為" + file.getPath());
/* Log日志輸出如下:
11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: Environment.getExternalStorageDirectory()為:/storage/emulated/0
11-14 21:14:21.265 22529-22529/com.example.liang.myapplication I/xinxi: file.getPath()為/storage/emulated/0/mo.mp4*/
videoview.setVideoPath(file.getPath());
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//這個(gè)方法是當(dāng)系統(tǒng)提示用戶是否開(kāi)啟權(quán)限的時(shí)趟济,當(dāng)用戶選擇開(kāi)啟或者是禁止時(shí)觸發(fā)的
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case (1):
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)//grant是同意的意思,grantResults這個(gè)參數(shù)中放的是0或者是1蛛淋,0表示同意咙好,1表示禁止
{
Toast.makeText(MainActivity.this, "已經(jīng)有權(quán)限了", Toast.LENGTH_SHORT).show();
chushihua();
} else {
Toast.makeText(MainActivity.this, "請(qǐng)先申請(qǐng)權(quán)限", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(videoview!=null){
videoview.suspend();
}
}
}
記得在androidmanifest中申明
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>