調(diào)用攝像頭和相冊(cè),音樂(lè)控制,視頻控制

注意: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路徑寫(xiě)入,照片就會(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)緩存路徑的話(huà)直接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)提示用戶(hù)是否開(kāi)啟權(quán)限的時(shí),當(dāng)用戶(hù)選擇開(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)緩存路徑的話(huà)直接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)提示用戶(hù)是否開(kāi)啟權(quán)限的時(shí),當(dāng)用戶(hù)選擇開(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"/>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,070評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 我們平時(shí)在使用QQ或微信的時(shí)候經(jīng)常要和別人分享圖片,這些圖片可以是用手機(jī)攝像頭拍的,也可以是從相冊(cè)中選取的...
    AndYMJ閱讀 1,770評(píng)論 0 2
  • 原文鏈接http://www.cnblogs.com/kenshincui/p/4186022.html 音頻在i...
    Hyman0819閱讀 22,151評(píng)論 4 74
  • 那時(shí)候,天還很藍(lán) 溪水比現(xiàn)在更加的清涼 夏風(fēng)也很溫柔 我們都喜歡躺在青草地上 那時(shí)候,路還不長(zhǎng) 車(chē)輛比現(xiàn)在少 但追...
    Josan喬閱讀 228評(píng)論 4 7

友情鏈接更多精彩內(nèi)容